Author: wilaiwan.h

  • JavaScript : ไม่ควรใช้ For Loop ใน Arrays

    เชื่อว่า Programmer/Developer JavaScript ล้วนเคยผ่านการใช้งาน For Loops ในการ Coding กันมาแล้ว จำเป็นที่คุณต้องเลือกใช้มันให้เหมาะกับแต่ละสถานการณ์ แนะนำว่า ไม่ควรใช้ For Loop ใน Arrays แต่ขอแนะนำให้ใช้ .forEach() Method แทน

    .forEach() Method คืออะไร

    .forEach()  เป็น Built-in Method ใน Array Class ซึ่งได้รับการเปิดตัวใน ECMAScript 2015 (หรือที่เรียกกันว่า ES6) โดย Method จะทำการ Callback เป็น Arguments และเพื่อไม่ให้เกิดปัญหาขึ้น Callback จะเป็น Function ที่ถูก Execute สำหรับทุก item ใน Array

    ตัวอย่าง เพื่อแสดงถึงการใช้งานพื้นฐานของ .forEach() Method เรามาเริ่มด้วยการ Define Array ของ Integer แล้ว Print ค่าที่เป็น ยกกำลัง2 ของพวกมันลงใน Console

    let nums = [1,2,3,4,5];
    
    nums.forEach(function(n) {
       console.log(n * 2); 
    });
    
    // 2, 4, ุ6, 8, 10

    การเพิ่ม Index เข้าไป

    เราได้ทำการเพิ่ม Optional Parameter ตัวที่ 2 เข้าไปใน Function Definition ของเรา

    let nums = [1,2,3,4,5];
    
    nums.forEach(function(n,i) {
       console.log("i: " + n * 2);
    });
    /*
      0: 2
      1: 4
      2: 6
      3: 8
      4: 10
    */

    การจัดเก็บค่าด้วย .forEach()

    แล้วถ้าเราไม่ต้องการที่จะ Print ทุกอย่าง แต่อยากเก็บ Result ไว้ในตัวแปรใหม่ล่ะ? จะเห็นว่า .forEach() Method ไม่มีการ Return ใด ๆ กลับมาให้ ซึ่งการใช้ .map() Method ดูจะเป็นคำตอบที่ดีที่สุดในสถานการณ์นี้ แต่อย่างไรก็ตาม หากต้องการใช้ .forEach() เราสามารถเขียน Code ใหม่ได้ดังนี้

    let nums = [1,2,3,4,5];
    let result = [];
    nums.forEach(function(n) {
       result.push(n*2);
    });
    console.log(result); 
    
    // [2,4,6,8,10];

    การเขียน Callback Function สั้นกระชับขึ้น

    หากต้องการทำให้ Code สั้นกระชับมากขึ้น สามารถเขียนได้ดังนี้

    let nums = [1,2,3,4,5];
    
    nums.forEach((n) => {
       console.log(n *2);
    });
    

    หรือแบบนี้ก็ได้เช่นเดียวกัน

    let nums = [1,2,3,4,5];
    
    nums.forEach(n => console.log(n *2));

    อ้างอิง : https://medium.com/better-programming/stop-using-for-loops-to-iterate-over-arrays-5c46940e79d1

  • ปรับแต่ง SQL ให้เร็วขึ้น

    เมื่อคุณ Run SQL Queries แล้วมันทำงานช้าขึ้นมา เราจะต้องกลับเข้าไปดู Queries ที่เขียนว่าจะสามารถแก้ไขจุดที่เป็นต้นเหตุได้อย่างไร บทความนี้เราจะมาแนะนำดูวิธีปรับแต่ง Queries ที่ทำงานช้าให้เร็วยิ่งขึ้นกัน

    ไม่จำเป็นต้องใช้ข้อมูลทุกอย่าง

    พิจารณาว่าจำเป็นต้องใช้ SELECT * หรือไม่? ควรจะดึงเฉพาะ Column ที่ต้องการเพื่อให้ได้ผลที่รวดเร็วขึ้น แทนที่จะใช้ SELECT * เพื่อดึงข้อมูลทั้งหมดออกมา

    หากมี Table ที่มีขนาดใหญ่หรือมีข้อมูลปริมาณมากใน Table ซึ่งมีแนวโน้มที่จะทำให้ Query Engine ต้องทำงานหนักในการดึงข้อมูลทุกอย่างไปสู่ Client Side ก็อย่าลืมที่จะใช้ LIMIT เพื่อจำกัดจำนวนของผลลัพธ์ เว้นเสียแต่ว่าต้องการดูข้อมูลในทุก ๆ Row

    ระวังการใช้ NOT IN

    พยายามหลีกเลี่ยงการใช้ ‘IN’ หรือ ‘NOT IN’ เพราะการทำเช่นนี้ หมายถึง กำลัง Scan ทั้ง Table อยู่ เพราะ Query Engine จะไล่ดูไปที่ทุก Row เพื่อตรวจสอบว่า ตรงตามเงื่อนไขหรือไม่ ให้เปลี่ยนมาใช้ ‘EXISTS’ หรือ ‘NOT EXISTS’ ดู เพราะมันจะส่งผลกระทบต่อ Query Plan น้อยกว่าการใช้ ‘NOT IN’

    ใช้ Wildcards เท่าที่จำเป็น

    การใช้ Wildcards ที่จุดเริ่มต้นและจุดสิ้นสุดของ LIKE จะทำให้การ Query ช้าลง และอาจจะทำให้ได้ผลลัพธ์ที่มากเกินกว่าที่คุณต้องการ ให้ใช้ Wildcards เฉพาะเมื่อต้องการใช้งานจริง ๆ เท่านั้น โดยทั่วไปจะใช้กันเพียงแค่จุดเดียวเท่านั้น ดังนั้น จึงควรคำนึงถึงสิ่งที่ต้องการจะให้ Query Engine ทำ

    ระวัง Nested Queries

    การ Run หลาย ๆ Queries ซ้อนกันไปเรื่อย ๆ (Nested Queries) เหมือนอย่าง Function ถือเป็นสิ่งที่ไม่แนะนำให้ทำ และมันจะเร็วกว่าหากเขียนลงใน Table ลองพิจารณาการสร้าง Staging Tables ซึ่งนั่นหมายถึง เรากำลัง Join Subset ของข้อมูลที่เล็กลง ทำให้การ Query เร็วขึ้น

    ระวังการใช้ Views ซ้อน ๆ กัน

    Views เป็น Queries ที่จะ Run เมื่อเราเรียกใช้งาน หรือดูข้อมูล ซึ่งหากกำลังเรียกหลาย ๆ View หรือในกรณีที่แย่ที่สุด คือ การเรียก Views ซ้อน Views ซ้อน Views ไปเรื่อย ๆ นั่นคือ เรากำลังบอกให้ Query Engine ทำการ Run หลาย ๆ Queries เพื่อ Return Row และ Column ที่ต้องการ ลองเปลี่ยนเป็นเขียนมันลงไปใน Table หากต้องการดูข้อมูลในแต่ละ วัน/สัปดาห์/เดือน แทนที่จะใช้ Views เพื่อ Filter ข้อมูล

    แต่ถ้าหากยังมีความจำเป็นใช้ Nested Views อยู่ อยากให้ลองพิจารณาดูว่า ยังมีวิธีอื่นอีกหรือไม่ ที่สามารถทำได้ตรงกว่านี้ในการเข้าถึง Row และ Column ที่ต้องการด้วยการเขียน Queries แทนการ Run หลาย Queries เพื่อไปยัง Column ที่ต้องการจาก Nested Views ตัวสุดท้าย

    Indexes

    Indexes จะช่วยเพิ่มความเร็วให้ Queries ของเรา โดยการจัดลำดับข้อมูลเพื่อให้ Database Engine ทราบว่าจะหาข้อมูลที่ต้องการได้จากที่ไหน หรือมี Lookup Table เพื่อที่มันจะสามารถทราบตำแหน่งที่จะค้นหาได้ ประเภทของ Indexes ที่ใช้จะเป็นตัวกำหนดวิธีการทำงานของ Indexes และใช้ Indexes สำหรับ Column ที่จะใช้งานมันบ่อย ๆ ใน Queries

    อ้างอิง : https://dev.to/helenanders26/sql-201-10-ways-to-tweak-slow-running-queries-3pkb

  • Database Design Tools (2)

     DbVisualizer

    DbVisualizer เป็น Tool ที่ออกแบบมาสำหรับการจัดการ Database มัน Integrate เข้ากับหลาย Databases และสามารถทำงานกับ Operating System หลัก ๆ ได้ทั้งหมด

    DbVisualizer มีการ Integrate Interface ที่ใช้งานง่าย มันสามารถถูกใช้เพื่อเรียกดู Schema ที่ซับซ้อนและ Data ที่แก้ไข Interface ช่วยให้ User สามารถทำสิ่งต่าง ๆ เช่น Drag & Drop, Pin Tabs, Detach Tabs ใน Windows ที่แยกออกไป รวมทั้ง Inline Edit

    Server Management

    DbVisualizer ช่วยให้ User สามารถจัดการกับ Instances, Security และ Session Storage ของ Database Server ,User ยังสามารถ Schedule และ Execute การดำเนินการต่าง ๆ กับ Oracle, MySQL, PostgreSQL และ SQL Server ได้

    Comparing

    Tool นี้ช่วยให้ User สามารถเปรียบเทียบ Objects อย่าง Table Data, Scripts หรือ DDL ของ 2 Tables หรือ Procedures ได้ โดย Interface ที่ทำการเปรียบเทียบนั้น Clean และสามารถเข้าใจได้ง่าย

    SQL Tools

    DbVisualizer มี Tools อื่น ๆ ที่มีประโยชน์อีก เช่น:

    • SQL Commander: Query Tool ที่รองรับ Editors และ Result Sets ต่าง ๆ
    • Query Builder: ช่วยให้ User สามารถเห็นการ Create และ Execute Queries ได้อย่างชัดเจน
    • Explain Plan: Tool ที่ใช้สำหรับวิเคราะห์ว่าจะใช้ Query อย่างไรใน Database แต่ Feature นี้สามารถใช้งานได้กับบาง Database เท่านั้น

    Tool นี้ Integrate SQL History Tool ซึ่งช่วยให้ User สามารถดู Query ก่อนหน้านี้ได้

    Supported Databases

    DbVisualizer มาพร้อมกับการ Integrate กับหลาย Databases หลัก ๆ ได้ และสามารถ Connect กับ Database โดยใช้ JDBC Drivers

    DbVisualizer เป็น Tool ที่ยอดเยี่ยมสำหรับการจัดการ Database มันมี Interface ที่เป็นมิตรกับ User และสามารถทำงานได้กับ Operating Systems ยอดนิยมต่าง ๆ แต่ ผู้ที่ใช้ Free Version ของ Tool นี้ ไม่สามารถใช้งานใน Feature ที่สำคัญ ๆ ได้ ในขณะที่ Paid Version ก็มีราคาที่ค่อนข้างสูง

    Vertabelo

    Vertabelo เป็น Database Design Tool แบบ Online ที่ช่วยให้สมาชิกในทีมสามารถทำงานร่วมกันใน Projects ได้อย่างง่ายดาย เนื่องจากมันอยู่ใน Online Platform จึงทำให้ User สามารถ Share การเข้าถึงไปยังสมาชิกในทีมผ่านทาง Email ได้

    Vertabelo มีระดับการเข้าถึงที่แตกต่างกันถึง 3 Levels คือ Owner, Editor และ Viewer , Vertabelo มี Interface ที่ทั้ง Clean และใช้งานง่าย คุณสามารถสลับไป-มาระหว่าง Models ต่าง ๆ โดยที่ไม่ต้องออกจาก Design Area

    Tool นี้ได้ Integrate Quick Search และ Fast Navigation Menu ซึ่ง Features เหล่านี้มีประโยชน์อย่างมากเมื่อต้องทำงานกับ Databases ขนาดใหญ่

    Vertabelo อนุญาตให้ User สามารถ Reverse Engineer Schema ได้จาก Database แต่น่าเสียดายที่ Reverse Engineer Tool ไม่มี Graphical Interface หากต้องการ Run มันคุณจะต้องไปที่ Website และใช้ Command Line จากที่นั่น

    ข้อเสียอีกอย่างหนึ่งของ Reverse Engineer Tool ก็คือคุณต้องจัดแต่ง Tables ให้เรียบร้อยด้วยตนเอง หลังจากการ Upload ขึ้นไป

    Model

    Vertabelo ใช้ Model เพื่อบันทึก Design โดย Model สามารถถูก Share ภายในทีมเป็น Document ซึ่งมี Access Levels ที่แตกต่างกัน โดยที่:

    • Model สามารถถูก Share ออกไปนอก Vertabelo ได้โดยใช้ Public Link
    • พวกมันสามารถถูก Clone เพื่อที่จะสามารถ Track Version ก่อนหน้าของ Design ได้
    • พวกมันคล้ายกับ DbSchema Project Files

    Supported Databases

    Vertabelo รองรับเฉพาะ 8 Databases หลัก ๆ: Oracle, MySQL, PostgreSQL, SQLite, IBM DB2, SQL Server, HyperSQL และ Amazon Redshift

    Vertabelo เป็น Database Designer ที่ดี มันมี Interface ที่เป็นมิตรกับ Users และมีความทันสมัย สามารถเข้าถึงได้ง่ายและสามารถ Share ในทีมได้ง่าย แต่ Database ที่รองรับมีจำนวนน้อย และ Reverse Engineer Tool ที่ไม่ค่อยดีนัก

    อ้างอิง : https://www.techstarthailand.com/blog/detail/Top-4-Database-Design-Tools/1324

  • Database Design Tools

    Database Design ที่ดีจะช่วยลดงานในส่วน Maintenance ลงได้อย่างมาก และลดโอกาสเกิดข้อผิดพลาดใน Project  เนื่องจากแต่ละ Project  มี Requirements ที่แตกต่างกัน ทำให้การค้นหา Tools ที่เหมาะสมอาจเป็นเรื่องยาก ดังนั้นบทความนี้จะมาแนะนำ Database Design Tools ที่คาดว่าจะมีประโยชน์กับคุณ

    Toad Data Modeler

    Toad Data Modeler เป็น Database Modeling Tool ที่ใช้ Automation, Intuitive Workflows และ Built-in Expertise อีกทั้ง Toad ยังเป็น Database Solution ยอดนิยมที่ Community ของมันมีการเติบโตอย่างต่อเนื่อง

    Toad มี User Interface ที่ช่วยให้ User เข้าใจ Databases และ Table Relationships ได้ดียิ่งขึ้น มันสามารถสร้าง Data Models ทั้งแบบ Logical และ Physical และยังสามารถ Map Attributes ทั้งหมดของ Database ใน Physical Model ให้โดยอัตโนมัติ

    Models และ Synchronization

    Toad ช่วยให้ User สามารถ Convert Logical Model เป็น Physical Model ที่เลือกไว้ (เช่น Oracle, SQL Server เป็นต้น) และสามารถ Convert Physical Model ที่เลือกไว้ เป็นรูปแบบอื่น อย่างเช่น Convert Oracle Model ไปเป็น SQL Server

    Tool นี้จะมี Feature ของการ Synchronization อีกทั้ง User สามารถเปรียบเทียบ Models กับ Database และสร้าง Migration Scripts ได้ นอกจากนี้ยังช่วยให้ User สามารถ Update Model จาก Database ได้โดยตรง

    Toad สามารถทำ Processes อย่าง การเปรียบเทียบ Data และ Schema ได้โดยอัตโนมัติ

    SQL Code Generation

    Toad สามารถสร้าง Database DDL Scripts ที่มีความซับซ้อน นอกจากนี้ยังสามารถเปิด SQL Scripts ที่สร้างขึ้นใน Application ที่เกี่ยวข้องได้

    Reporting

    มันสามารถสร้าง Report ในรูปแบบของ HTML, RTF หรือ PDF ได้

    Supported Databases

    Tool สามารถ Connect กับ Databases ที่หลากหลาย เช่น Oracle, SAP, MySQL, SQLServer, PostgreSQL และอื่น ๆ อีกมากมาย

    จะเห็นว่า Toad เป็น Platform ที่มีประโยชน์อย่างยิ่งสำหรับ Database Modeling ที่มี Features ที่ยอดเยี่ยมอยู่มากมาย แต่มี User Interface ที่ใช้งานได้ค่อนข้างยาก และ License มีราคาค่อนข้างสูง

    DbSchema

    DbSchema เป็น Visual Tool สำหรับการออกแบบและการจัดการ Database ที่ซับซ้อน โดย Tool นี้สามารถ Integrate เข้ากับ Operating Systems หลัก ๆ ทั้งหมดได้

    DbSchema มาพร้อมกับ User Interface ที่เข้าใจง่ายและช่วยลดความยุ่งยากในการออกแบบ Database ทุกอย่างถูกจัดเตรียมไว้พร้อมแล้วใน Layouts ซึ่งมีประโยชน์อย่างยิ่งเมื่อต้องจัดการกับ Database ขนาดใหญ่ พวกมันช่วยให้ User สามารถ Focus เฉพาะส่วนที่ต้องการของ Database ได้

    ตัว Interface จะช่วยทำให้ User สามารถ เรียกดู Diagram ได้อย่างอิสระ, Drag & Drop Tables ใน Layouts หรือ แก้ไข Table Data ด้วยการ Double-Click

    DbSchema สามารถทำการ Reverse Engineer Schema จาก Database ที่มีอยู่ได้อย่างง่ายดาย

    Project File และ Schema Synchronization

    DbSchema จะเก็บ Schema Design ลงใน Project File ซึ่งการทำงานกับ Project File จะช่วยให้ User สามารถ Modify Schema Design ได้โดยไม่ต้อง Connect กับ Database ส่วนการเปลี่ยนแปลงต่าง ๆ จะถูกบันทึกลงในเฉพาะ Project File เท่านั้น

    เมื่อ Connect กับ Database อีกครั้ง User จะเปรียบเทียบความแตกต่างระหว่าง Project File และ Database จากนั้นก็ Synchronize พวกมัน

    Sharing

    DbSchema Project Files สามารถถูก Share ภายในทีมได้อย่างง่ายดายโดยใช้ GIT หรือ Versioning System อื่น ๆ อีกทั้ง Schema 1 ตัว สามารถถูก Migrate ผ่านหลาย ๆ Servers ได้

    สำหรับ Project File จะอยู่ในรูปแบบ XML ซึ่งง่ายต่อการอ่านหรือแก้ไขด้วย Text Editor ต่าง ๆ

    Visual Data Tools

    DbSchema สามารถ Integrate กับ 3 Data Tools ดังต่อไปนี้:

    • Relational Data Browse: จะช่วยให้ User สามารถเรียกดู Data ได้จากหลาย Tables พร้อมกัน
    • Visual Query Builder: สามารถสร้าง SQL Queries ที่ซับซ้อนได้
    • SQL Editor: เป็น Editor ที่มีประสิทธิภาพ ที่ใช้สำหรับ Text Autocompletion

    Supported Databases

    DbSchema มาพร้อมกับการ Integrate กับ Databases ส่วนใหญ่ได้ ส่วน Databases อื่น ๆ สามารถ Connect ผ่าน JDBC Drivers

    DbSchema เป็น All-in-one Database Designer & Manager มันเป็น Tool ที่มีประโยชน์อย่างมากโดยเฉพาะการจัดการ Databases ที่ซับซ้อน แต่มี Forms และ Reports Engine ที่ค่อนข้างใช้งานยาก

    อ้างอิง : https://www.techstarthailand.com/blog/detail/Top-4-Database-Design-Tools/1324

  • SQL พื้นฐานสำหรับ Data Analyst

    สำหรับคนที่มีพื้นฐานหรือเคยใช้งาน SQL มาบ้างแล้ว จะรู้จักคำสั่ง SQL พื้นฐานต่างๆ มีบางส่วนที่ไม่ค่อยใช้งานมัน แต่มันมีประโยชน์อย่างยิ่งโดยเฉพาะสำหรับ Data Analyst เช่น

    Distinct

    ในบางครั้ง ถ้าต้องการ Records ของข้อมูลที่ไม่ซ้ำกัน สามารถใช้ Distinct มาช่วยเพื่อให้ได้ข้อมูลที่ไม่ซ้ำกัน โดยใช้งานกับ Columns

    Select distinct fac_id from student

    IN

    IN Operator ช่วยให้สามารถทดสอบได้ว่า Expression นั้นตรงกับ Value ใด ๆ ใน List ที่ระบุหรือไม่ มันจะช่วยลดการใช้งาน “OR” หลาย ๆ เงื่อนไข

    select * from student where campus_id in ('01','02', '03')

    Having

    มันเป็นการใช้เงื่อนไขกับกลุ่มของผลลัพธ์เพื่อกรองข้อมูลออกมา แต่คำถามที่น่าสนใจก็คือ ทำไมถึงไม่ใช้ “WHERE” ที่หลาย ๆ คนคุ้นเคยกันล่ะ แน่นอนว่าเราใช้ “WHERE” เพื่อระบุเงื่อนไขให้กับ Columns ที่เราเลือก ในขณะที่ “HAVING” จะถูกใช้เพื่อระบุเงื่อนไขให้กับ Groups ที่ถูกสร้างขึ้นโดย “GROUP BY” Clause

    “HAVING” Clause จะต้องถูกใช้ตามหลัง “GROUP BY” Clause แต่จะอยู่ก่อน “ORDER BY” Clause

    ในตัวอย่างด้านล่างนี้ SQL HAVING Clause จะ Filter ผลลัพธ์เฉพาะ คณะที่มีจำนวน นักศึกษา มากกว่า 500 คน เท่านั้น

    select fac_id, count(student_id)
    from student
    group by fac_id
    having count(student_id) > 500

    LIMIT

    “LIMIT” ถูกใช้เพื่อจำกัดหรือกำหนดจำนวนของผลลัพธ์ตามจำนวนที่แน่นอน เนื่องจากในบางครั้งก็จำเป็นต้องจำกัดจำนวนของผลลัพธ์ของการ Query

    select * from student LIMIT 10

    Wild Cards

    โดยทั่วไปแล้ว Wild Card เป็นวิธีในการค้นหาตัว Characters ผ่าน Strings ซึ่ง Wild Card ใช้ “LIKE” Operator โดย Wild Card ที่เป็นที่รู้จักและถูกใช้งานกันมากที่สุด ก็คือ “%” และ “_”

    • “%” : หมายถึง ศูนย์หรือมากกว่าหนึ่ง Character

    ในตัวอย่างด้านล่าง เรากำลังบอก SQL ให้ดึงข้อมูลจาก Table “student” ที่ใน Column “name” เริ่มต้นด้วยตัวอักษร “w” แล้วตามต่อด้วยตัวอักษรอะไรก็ได้และมีจำนวนกี่ตัวก็ได้

    select * from student where name like 'w%'

    อีกตัวอย่างหนึ่ง ซึ่งเรากำลังบอก SQL ให้ดึงข้อมูลจาก Table “student” ที่ใน Column “name” ลงท้ายด้วยตัวอักษร “wan” และสามารถเริ่มต้นด้วยตัวอักษรอะไรก็ได้และมีจำนวนกี่ตัวก็ได้

    select * from student where name like '%wan'
    • “_” : หมายถึง Character เพียงตัวเดียวเท่านั้น

    ใน Query ด้านล่าง จะทำการดึงข้อมูลที่เริ่มต้นด้วยตัวอักษรอะไรก็ได้ 1 ตัว แล้วตามด้วยตัวอักษรต่าง ๆ ตามรูปแบบ  “_ilaiwan”

    select * from student where name like '_ilaiwan'

    หรีอต้องการดึงผลลัพ์ธ์จาก Column “name” ที่เริ่มต้นด้วย “wilaiwa” แล้วตามด้วยตัวอักษรอะไรก็ได้อีก 1 ตัว 

    select * from student where name like 'wilaiwa_'

    และสามารถใช้งานด้วยการรวมทั้ง 2 อย่างเข้าด้วยกันเพื่อการกำหนดผลลัพธ์ที่เจาะจงมากขึ้น เช่น ดึงข้อมูลจาก Column “email” ที่ขึ้นต้นด้วยจำนวนตัวอักษรกี่ตัวก็ได้ และลงท้ายด้วยอักษรเพียงตัวเดียว

    select * from student where email like '%.co_'

    อ้างอิง : https://www.techstarthailand.com/blog/detail/SQL-Beyond-The-Basics/1296

  • การเปลี่ยนแปลง Coded UI Test ใน Visual Studio 2019

    Microsoft ได้ประกาศว่า Visual Studio 2019 จะเป็น Visual Studio รุ่นสุดท้ายที่มีฟังก์ชัน Coded UI test

    ทำไมถึงเลิกใช้ Coded UI Test

    Coded UI tests ถูกใช้งานสำหรับการทดสอบการทำงานแบบอัตโนมัติของ web apps และ desktop apps โดยที่ในช่วงหลายปีหลังมานี้ Open source UI testing tools เช่น Selenium และ Appium ที่มีแรงสนับสนุนจาก community ที่เข้มแข็งและกลายเป็นมาตราฐานกลาง ซึ่ง Coded UI tests นั้นก็มีพื้นฐานอยู่บน Selenium นอกจากนี้ทั้ง Selenium และ Appium ยังทำงานข้ามแพลตฟอร์มและรองรับภาษาการเขียนโปรแกรมหลายภาษา

    Microsoft จะยังคงให้การสนับสนุน Coded UI tests ใน Visual Studio 2019 อย่างเต็มที่ในอีกหลายปีในอนาคต แต่จะจำกัดเฉพาะการแก้ไขข้อบกพร่อง จะไม่มีการเพิ่มคุณสมบัติใหม่ โดยที่เราสามารถติดตั้ง Visual Studio รุ่นต่าง ๆ แบบ side by side ซึ่งหมายความว่านักพัฒนาจะสามารถใช้ Visual Studio 2019 สำหรับการทดสอบ Coded UI test ที่มีอยู่ ในขณะที่สามารถใช้ Visual Studio รุ่นใหม่ในอนาคตสำหรับความต้องการการพัฒนาในแบบอื่น ๆ

    กลไกการติดตั้งแบบ side by side ทำให้ CI/CD pipelines  ทำงานได้อย่างราบรื่นโดยไม่หยุดชะงักในขณะที่เปลี่ยนแปลง นี่เป็นเพราะ Coded UI tests ทำงานเป็นส่วนหนึ่งของ CI/CD pipelines ใน Azure DevOps โดยการทดสอบจะทำงานกับ Visual Studio รุ่นใดรุ่นหนึ่งที่ติดตั้งใน agent หรือแพลตฟอร์มทดสอบรุ่นใดรุ่นหนึ่งโดยเฉพาะ  ซึ่งหมายความว่าเราไม่จำเป็นต้องใช้ Azure DevOps server สองรุ่นที่แตกต่างกันเพื่อให้สามารถทดสอบ Coded UI ที่มีอยู่ ในขณะที่มีการเปลี่ยนแปลง

    ทางเลือกที่แนะนำใช้แทน Coded UI Test

    Microsoft แนะนำให้ใช้ Open source UI testing tools Selenium และ Appium มาระยหนึ่งแล้ว ซึ่ง Visual Studio 2019 ถือเป็น Visual Studio รุ่นสุดท้ายที่มีฟังก์ชัน Coded UI test โดยที่ Microsoft แนะนำให้ใช้ Selenium สำหรับการทดสอบเ web application และAppium กับ WinAppDriver สำหรับการทดสอบ Desktop application (WPF, WinForms, Win32) และ UWP apps

    ไม่มีเครื่องมืออัตโนมัติที่จะช่วยย้ายจาก Coded UI test ไปยัง Selenium หรือ Appium ในขณะนี้ เราแนะนำให้การสร้าง unit test ใหม่ ควรใช้ทาง Selenium หรือ Appium ในขณะที่วางแผนการแทนที่ Coded UI test เก่าเป็น Selenium หรือ Appium ให้เสร็จสมบูรณ์ก่อนสิ้นสุดระยะเวลาการสนับสนุนจาก Visual Studio

    Selenium Browser Automation Project

    Selenium เป็นเครื่องมือและไลบรารี สำหรับใช้งานและสนับสนุนการทำงานอัตโนมัติของ web browser มันมีส่วนขยายที่จะจำลองการโต้ตอบของผู้ใช้กับ browser และโครงสร้างพื้นฐานสำหรับการใช้งานข้อกำหนด W3C WebDriver ที่ช่วยให้เราสามารถเขียนรหัสที่สามารถใช้ได้สำหรับ web browser หลักทั้งหมด

    ที่แกนกลางของ Selenium คือ WebDriver เป็น interface สำหรับเขียนชุดคำสั่งที่สามารถเรียกใช้ได้ในเบราว์เซอร์จำนวนมาก นี่ตัวอย่างของชุดคำสั่งแบบง่ายของ c#

    using System;
    using OpenQA.Selenium;
    using OpenQA.Selenium.Firefox;
    using OpenQA.Selenium.Support.UI;
    using SeleniumExtras.WaitHelpers;
    
    class HelloSelenium
    {
        static void Main()
        {
            using (IWebDriver driver = new FirefoxDriver())
            {
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                driver.Navigate().GoToUrl("https://www.google.com/ncr");
                driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
                IWebElement firstResult = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("h3>div")));
                Console.WriteLine(firstResult.GetAttribute("textContent"));
            }
        }
    }  

    ในบทความต่อไป เราจะลงไปในรายละเอียดของสิ่งที่เกิดขึ้นเบื้องหลังเมื่อคุณเรียกใช้รหัสนี้ พร้องทั้งการติดตั้งและใช้ Selenium เป็นเครื่องมือทดสอบอัตโนมัติ

    อ้างอิง
    1. https://devblogs.microsoft.com/devops/changes-to-coded-ui-test-in-visual-studio-2019/
    2. https://selenium.dev/documentation/en/

  • Notebook Tips – ประหยัด ยืดอายุแบตเตอรี่

    มีคำถามมากมายเกี่ยวกับแบตเตอรี่ ไม่ว่าจะเป็นการชาร์จ, แบตเสื่อม ประหยัดแบต โน๊ตบุ๊คและอีกมากมาย เนื่องด้วยในบรรดาอุปกรณ์ภายในโน๊ตบุ๊คของเราส่วนมาก สิ่งที่จะมีปัญหาอันดันแรก นั้นก็คือแบตเตอรี่ ซึ่งหากใช้งานไม่ถูกต้อง ซื้อมาเพียงไม่กี่เดือนแบตก็เสื่อมแล้ว ทำให้เป็นปัญหาเวลาใช้นอกสถานที่เป็นอย่างมาก

    1.ปล่อยให้แบตเตอรี่หมดก่อนแล้วค่อยชาร์จ เรื่องความร้อนนั้นเป็นของคู่กับโน้ตบุ๊คด้วยเลยก็ว่าได้ ส่วนสำหรับแบตเตอรี่นั้นหากได้รับความร้อนนานๆ อายุก็จะสั้นลงแน่นอน แต่เอ๊ะ!! แล้วจะให้ทำยังไงหละในเมื่อการชาร์จทุกเครื่องมันก็ร้อนนิหน่า ถูกไหม? แต่มีวิธีแนะนำ นั้นก็คือ อย่าปล่อยให้แบตเตอรี่อยู่ต่ำกว่าประมาณ 20% ซึ่งถ้าจะให้ดีควรอยู่ในระดับ 20-30% หรืออาจจะ 40% ก็ได้ แต่ก็อย่าเกินนี้ เพราะยิ่งแบตเหลือน้อยมากๆ การชาร์จมันก็จะนาน ทำให้เกิดความร้อนมากกว่านั้นเอง และที่สำคัญอย่าให้แบตเตอรี่หรือตัวเครื่องโน้ตบุ๊คเราอยู่ใกล้กับสิ่งของร้อนๆ ด้วย

    2.ถอดแบตเตอรี่ออกขณะเล่นเกมหรือเวลาอยู่บ้าน ถามกันว่าต้องถอดแบตเตอรี่หรือเปล่า? ต้องใส่ไว้ตลอดไหม? วันนี้ก็มีคำตอบให้ หากเราถอดไว้แล้ว แต่เกิดปัญหา ไฟดับ ไฟกระชาก มันก็อาจจะทำให้อุปกรณ์หรือโน้คบุ๊คของเราเสียหายได้ครับ ซึ่งอันที่จริงหากเราถอดแบตเตอรี่ออกมามันจะช่วยให้ยืดอายุการใช้งานได้จริง แต่มันก็เพียงเล็กน้อย แล้วมันจะคุ้ม? กับสิ่งที่เราอาจจะเสียไป ดูแล้วมันก็คงได้ไม่คุ้มเสีย

    3.ถอดแบตเตอรี่เก็บไว้ ไม่ต้องใช้ ไม่เสื่อม ปกติแบตเตอรี่ อายุประมาณ 1 ปีหรืออาจจะน้อยหรือมากกว่า ตามลักษณะการใช้งาน เราก็เริ่มเห็นปัญหาแบตเตอรี่เสื่อมแล้ว ใช้งาน 1 ปีเต็มพอดี แบตก็ใช้งานได้สั้นลง 30 นาที จากปกติใช้ได้ 3 ชั่วโมง ตอนนี้ก็เหลือ 2 ชั่วโมง 30 นาทีโดยประมาณ ใช้ถูกหลักบ้างไม่ถูกหลักบ้างตามสถานะการ และแต่ส่วนใหญ่แล้วแบตเตอรี่มักจะสิ้นใจก่อนโน้ตบุ๊คของเราอยู่แล้ว โดยปกติก็ โน้ตบุ๊ค 1 เครื่อง กับ แบตเตอรี่ 2 ลูก ก็ถือว่ากำลังดี ก็คือใช้ตัวที่แถมมา และเราก็เปลี่ยนหนึ่งครั้ง มันก็จะสิ้นอายุไขของมัน หรือบางท่านก็อาจจะใช้แบตเตอรี่ลูกเดียวแบบนี้ก็ถือว่าคุ้มค่ามาก

    เพิ่มชั่วโมงการทำงานของโน้ตบุ๊ตบนแบตเตอรี่ โดยไม่ต้องเสียสตางค์

    วิธีพื้นฐานคลาสสิคยิ่งนัก โดยเจ้า Windows Power Manager นั้นจะมีติดตั้งมาให้บนโน้ตบุ๊คทุกตัว(ที่ใช้ Windows) โดยวิธีที่ง่ายที่สุดที่ไม่ต้องปรับแต่งอะไรเลยก็คือเลือกปรับให้มันเป็น Power Saver นั่นเอง แต่ระดับสมาชิก NBS คงไม่ทำอะไรง่ายๆ  ซึ่งมันก็มีวิธีแอดวานซ์กว่านั้น ก็คือให้สังเกตเครื่องหมายรูปถ่านที่ Task Bar > คลิกซ้าย เลือก More Power Option > Change Plan Setting > Change Advance Power Option ที่นี้มันก็จะขึ้นหน้าต่าง Power Option

    หัวข้อที่แนะนำให้ปรับถ้าต้องการใช้แบตเตอรี่โน้ตบุ๊คนานๆ ก็จะ Processor ให้ Maximize อยู่ที่ราวๆ 50% ก็จะช่วยประหยัดไฟได้พอสมควร โดยที่ประสิทธิภาพของเครื่องไม่ตกลงมากนัก การบล๊อกแฟลชโฆษณาต่างๆ และปิดโปรแกรมที่ไม่จำเป็นหรือปิด (Disable) Wireless / Bluetooth รวมถึง การลดความสว่างของหน้าจอ ก็ล้วนแต่มีส่วนช่วยให้ใช้งานได้ยาวนานขึ้น

    การ Calibrate Battery เพื่อเพิ่มอายุการใช้งาน เมื่อแบตเตอรี่โน้ตบุ๊กเสื่อมทำไงดี ?

    สำหรับผู้ที่ใช้โน้ตบุ๊คมาสักปี 2 ปีปัญหาหนึ่งที่มักจะเจอกันก็คือแบตเตอรี่เสื่อม?ซึ่งถ้าใช้เครื่องมาระดับนี้การเสื่อมของแบตเตอรี่ถือเป็นเรื่องปรกติ แม้ท่านจะทำวิธีใดก็ตามแบตเตอรี่ที่ท่านใช้ๆอยู่ก็ย่อมต้องเสื่อมไปตามการเวลาเป็นปรกติ หลายๆท่านอาจจะเลือกที่จะต่อ Adapter ตลอดเวลา หรือไม่ก็ซื้อเครื่องใหม่ไปเลย แต่อีกหลายๆท่านก็ยังจำเป็นต้องใช้แบตเตอรี่อยู่ (และก็ไม่มีตังซื้อเครื่องใหม่) การซื้อแบตเตอรี่ใหม่จึงเป็นทางเลือกที่น่าสนใจเพราะราคาถูกกว่าซื้อเครื่องใหม่ และก็ทำให้โน้ตบุกใช้งานแบตเตอรี่ได้เหมือนเดิมปัจจุบันแบตเทียบก็ถือเป็นตัวเลือกที่น่าสนใจสำหรับผู้ที่งบประมาณจำกัด แต่อยากเปลี่ยนแบตเตอรี่ก้อนเก่าที่เสื่อมแล้วเป็นแบตตัวใหม่ใสปิ้ง อีกทั้งปัจจุบันผู้ผลิตแบตเตอรี่เทียบหลายๆเจ้าก็พยายามพัฒนาคุณภาพให้เทียบเท่าแบตแท้จากผู้ผลิตโน้ตบุ๊ก โอกาสที่แบตเทียบจะมีปัญหาใช้งานได้ไม่เต็มที่หรือแบตเตอรี่ระเบิดก็มีโอกาสน้อย เพียงแต่ว่าเราต้องดูชื่อผู้ผลิตหรือนำเข้าให้มันใจ ยิ่งถ้าเป้นแบรนด์ที่ขายมานานหรือเป็นที่รู้จักก็จะช่วยให้เรามั่นใจขึ้น

    วิธีการประหยัดพลังงานให้แบตเตอร์รี่โน้ตบุ๊ก

    เครื่องโน้ตบุ๊กตัวโปรดของคุณจะกลายเป็นภาระอันใหญ่หลวงทันที ถ้าหากเราต้องมัวแต่วิ่งหาปลั้กไฟเพราะว่าแบตหมดก่อนเวลาอันควรเอาซะดื้อๆ ต่อไปนี้จะเป็น  วิธีการที่เราอยากจะแนะนำ เพื่อจะทำให้เครื่องโน้ตบุ๊กของคุณสามารถประหยัดพลังงาน และใช้งานแบตเตอร์รี่ของคุณเพิ่มเติมได้อีกหลายนาที

    1.จัดเรียงข้อมูลในฮาร์ดดิสก์อย่างสม่ำเสมอ ฮาร์ดดิสก์เป็นจุดที่ทำงานช้าและใช้พลังงานมากที่สุดจุดหนึ่งของเครื่องโน้ตบุ๊ก ยิ่งเราสามารถทำให้ฮาร์ดดิสก์ของเราทำงานได้ไวมากขึ้นเท่าไร ความต้องการที่จะใช้พลังงานก็จะน้อยลงเท่านั้น วิธีการหนึ่งที่ทำให้เครื่องทำงานได้เต็มประสิทธิภาพอยู่เสมอ ก็คือการ Defragment หรือจัดเรียงข้อมูลในฮาร์ดดิสก์นั้นเอง

    2.ปิดโปรแกรมที่ทำงานอยู่ด้านหลังออกไปบ้าง หากคุณเป็นคนที่ไม่ค่อยสนใจอะไรเวลาลงโปรแกรมล่ะก็ คุณจะได้โปรแกรมที่แอบทำงานอยู่เงียบๆ อยู่ข้างหลังตามมาเป็นว่าเล่น โปรแกรมพวกนี้ชอบถูกสั่งให้เปิดขึ้นมารอการใช้งานพร้อมกับ Windows ตั้งแต่แรก นั้นเป็นสาเหตุที่ทำให้เครื่องคอมพิวเตอร์ของคุณบูตช้าลงทุกวันๆ

    3.ดึงอุปกรณ์ภายนอกที่ไม่ได้ใช้ออก อุปกรณ์ USB ทั้งหลายแหล่ที่คุณเสียบทิ้งไว้กับเครื่อง จะดึงพลังงานออกไปจากแบตอยู่เสมอ ไม่ว่าจะมากหรือน้อยก็ตาม แม้แต่เม้าส์และตัว WiFi ถ้าหากคุณไม่ได้ใช้งานก็ควรจะปิด เพื่อให้เครื่องตัดกระแสไฟออกไป4.เพิ่มหน่วยความจำให้พอต่อการใช้งาน ยิ่งเครื่องมีแรมมากพอจะให้โปรแกรมใช้เท่าไร โอกาสที่โปรแกรมจะไปใช้ Virtual Memory จะลดลง ส่วน Virtual Memory คืออะไรนั้น ถ้าพูดง่ายๆ มันคือแรมที่ถูกจำลองขึ้นมาบนฮาร์ดดิสก์เพราะว่าแรมจริงนั้นมีไม่พอที่จะใช้ทำงาน และอย่างที่เราบอกไปในข้อแรมว่า ฮาร์ดดิสก์ทำงานช้าและใช้พลังงานเยอะมาก

    4.เพิ่มหน่วยความจำให้พอต่อการใช้งาน ยิ่งเครื่องมีแรมมากพอจะให้โปรแกรมใช้เท่าไร โอกาสที่โปรแกรมจะไปใช้ Virtual Memory จะลดลง ส่วน Virtual Memory คืออะไรนั้น ถ้าพูดง่ายๆ มันคือแรมที่ถูกจำลองขึ้นมาบนฮาร์ดดิสก์เพราะว่าแรมจริงนั้นมีไม่พอที่จะใช้ทำงาน และอย่างที่เราบอกไปในข้อแรมว่า ฮาร์ดดิสก์ทำงานช้าและใช้พลังงานเยอะมาก

    อ้างอิง : https://notebookspec.com/web/category/tips-tricks/

  • แนวทางการเขียน Unit Tests ที่ดีสำหรับ C # (2)

    ในบทความก่อนหน้า ได้พูดถึงการเลือก Testing framework ที่เหมาะสม การเขียน unit test โดยใช้แนวคิดแบบ “AAA” (Arrange, Acr, Assert) และการกำหนดชื่อ method ที่สื่อความหมายเข้าใจได้ง่าย

    Test Initialize & Cleanup

    เมื่อ unit tests ทำการทดสอบ methods ภายใน class ก็จำเป็นต้องสร้าง instance ของ class นั้นๆขึ้นมาก่อน ซึ่งจะเกิดขึ้นหลายๆครั้งใน unit test เพื่อประหยัดเวลาและทรัพยากรของระบบ เราสามารถใช้ [TestInitialize] attribute ของ MSTest เพื่อบอกว่า method นั้นใช้สำหรับกำหนดค่าเริ่มต้น สร้าง instance ของ class ก่อนที่จะเริ่ม run unit tests (หรือ [SetUp] ใน NUnit หรือถ้าใช้ xUnit.net ให้สร้างใน constructor )

    เมื่อการทดสอบจบลง เราจะต้องทำการ cleanup object ต่างๆที่ใช้ในการทดสอบ โดยการใช้ [TestCleanup] attribute ในกรณีที่ใช้ MSTest ([TearDown ใน NUnit หรือ implement IDisposable interface สำหรับกรณีที่ใช้ xUnit.net)

    ตัวอย่างด้านล่าง จะกำหนดให้ method “Initialize” เป็น method ที่ใช้สำหรับสร้าง instance ของ class ที่จะใช้ในการทดสอบ ซึ่งจะถูกเรียกใช้ก่อนการทดสอบจะเริ่มทำงาน

    ILogger _log;
    ICalc _calc;
    
    [TestInitialize]
    public void Initialize()
    {
    	_log = Mock.Of<ILogger<Calc>>();
    	_calc = new Calc(_log);
    }
    
    [TestMethod]
    public void Divide_ShouldThrowArgumentException_IfDivideByZero()
    {
    	double result = _calc.Divide(10, 5);
    	result.ShouldBe(2);
    }
    
    [TestCleanup]
    public void Cleanup()
    {
    	// Optionally dispose or cleanup objects
            _calc = null;
    	...
    }

    Shouldly Assertion Framework

    Shouldly framework จะช่วยให้ unit test ทำได้ง่ายและเข้าใจได้ง่ายขึ้น มันจะช่วยผู้พัฒนาในการเขียนการยืนยันผลการทำงานของ unit tests ซึ่งเมื่อกลับมาดู unit test อีกครั้งสามารถอ่าน code แล้วเข้าใจวัตถุประสงค์และความคาดหวังของการทดสอบ

    เปรียบเทียบความแตกต่างระหว่าง การใช้ Shouldly กับ ไม่ใช่ Shouldly

    With Shouldly

    result.ShouldBe(2);

    Without Shouldly

    Assert.AreEqual(2, result);

    Shouldly สามารถใช้ในการตรวจสอบ exception ว่าเกิดตามที่คาดหวังไว้หรือไม่ และสามารถตรวจสอบ meesage ของ exception ได้

    [TestMethod]
    public void Divide_ShouldThrowArgumentException_IfDivideByZero()
    {
    	Should.Throw<ArgumentException>(() => _calcs.Dicide(10, 0))
    	      .Message
                  .ShouldBe("Divide by zero.");
    }

    Moq Mocking Framework

    การสร้าง object จำลองสำหรับ object ที่ไม่ใช่ object หลักที่จะทำการทดสอบ แทนที่การเรียกใช้ object จริงๆ เช่น logging utility หรือ database จะทำให้การทดสอบทำได้อย่างมีประสิทธิภาพขึ้น ซึ่งการทำแบบนี้ เราต้องใช้ Mocking framework มาช่วย โดยตัวที่ได้รับความนิยมตัวนึงก็คือ Moq framework

    การใช้ Moq framework จะช่วยให่เราสามารถ mock class ต่างๆโดยใช้เพียง interface. ตัวอย่างเช่น การใช้ mock ของ logging utility ใน unit test แทนที่จะสร้างและเรียกใช้ logging utility ตัวจริง

    ILogger log = Mock.Of<ILogger<Calc>>();

    We can also verify if a mock object was invoked inside a method and the amount of times it was invoked:

    [TestMethod]
    public void Divide_LogInformationMethod()
    {
    	ILogger log = Mock.Of<ILogger<Calc>>();
    	ICalc calc = new Calc(log);
    	double result = calc.Divide(10,5);
    	Mock.Get(log).Verify(x => x.Log(
    		LogLevel.Information, 
        	It.IsAny<EventId>(), 
        	It.IsAny<FormattedLogValues>(), 
        	It.IsAny<Exception>(), 
        	It.IsAny<Func<object, Exception, string>>()), 
        	Times.Once);
    }

    อ้างอิง : https://kiltandcode.com/2019/06/16/best-practices-for-writing-unit-tests-in-csharp-for-bulletproof-code/

  • แนวทางการเขียน Unit Tests ที่ดีสำหรับ C #

    ในความคิดของผู้เขียน ผู้พัฒนาส่วนใหญ่มักไม่ชอบที่จะเขียน Unit testing บางคนอาจจะคิดว่ามันน่าเบื่อ หรือบางคนก็ไม่เห็นคุณค่าในการเขียน code เพื่อตรวจสอบการทำงานของ code อื่นๆ

    Unit testing คือแนวทางในการเขียน code เพื่อตรวจสอบว่าหน่วยการทำงานใน แอปพลิเคชันซอฟต์แวร์ ว่าทำงานตามที่ตั้งใจไว้หรือไม่ เช่น หากตั้งใจที่จะให้ตัวอักษรตัวแรกของคำเป็น พิมพ์ใหญ่ unit test จะต้องสามารถตรวจสอบว่าตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่โดยไม่สนใจอักษรตัวอื่นๆ

    ข้อดีอย่างหนึ่งของการเขียน unit tests ใน C # คือ เราสามารถใช้ Test Explorer ใน Visual Studio เพื่อตรวจสอบว่าการทดสอบทั้งหมดผ่านหรือไม่ โดยที่ไม่ต้องกังวลว่าการเปลี่ยนแปลงล่าสุดที่เขียน จะทำให้ระบบทำงานไม่ได้หรือไม่

    การเลือก Testing Framework

    Testing frameworks ช่วยให้เราสามารถใช้ attribute ในการเขียน unit tests [TestClass] หรือ [TestMethod] ซึ่ง attribute เหล่านี้บอกให้ Text Explorer ใน Visual Studio รู้จัก class หรือ method นั้นคือ unit test และจะรันโค้ดเพื่อตรวจสอบการทำงานว่าผ่านหรือไม่ผ่าน

    Testing frameworks สำหรับ. NET ที่ได้รับความนิยมคือ

    • MSTest
    • xUnit.NET
    • NUnit

    การเลือก Testing frameworks ก็เหมือนกับการเลือกรถ บางอันมีประสิทธิภาพสูง บางอันให้ความสะดวกสบาย แต่สุดท้ายทั้งหมดก็ทำงานเพื่อบรรลุเป้าหมายเดียวกัน

    NUnit เป็น test framework แรกๆที่ได้รับความนิยมสำหรับผู้พัฒนา .NET, เมื่อเปรียบเทียบกับความสามารถของ MSTest ( test framework ของ Microsoft) โดยส่วนใหญ่ก็จะเหมือนกับใน NUnit และ MSTest เป็น test framework ที่ถูกสร้างขึ้นและสามารถใช้งานได้ใน Visual Studio สำหรับ xUnit.NET เป็นน้องใหม่ใน test framework ที่นำเสนอคุณสมบัติเพิ่มเติมและวิธีการที่ง่ายขึ้นในการเขียน unit tests ที่พัฒนาโดย NET Core

    โดยส่วนใหญ่จะไม่ใช้เวลามากเกินไปในการพิจารณา test framework เพื่อใช้ในโครงการหากโครงการมีการกำหนด test framework ที่เฉพาะเจาะจง ก็ให้ใช้ test framework นั้น ถ้าไม่ได้กำหนด ก็ให้ทำการศึกษาและตัดสินใจเลือก test framework ที่เหมาะกับโครงการ

    AAA ( Arrange, Act, Assert )

    วิธีการเขียน unit test แบบ ‘AAA’ (Arrange, Act, Assert) เป็นวิธีปฏิบัติในการเขียน unit test และช่วยให้เราสามารถเขียน unit test ในรูปแบบที่ทำซ้ำและเข้าใจได้

    Arrange

    เราจะเริ่มเขียน unit test โดยการจัดเรียง objects ที่ต้องการทดสอบ ซึ่งอาจจะเป็นการ initializing class หรือ การเตรียมข้อมูลในฐานข้อมูลสำหรับทดสอบ หรือการ mocking object โดยการใช้ interface

    ตัวอย่างด้านล่าง มีกำหนดค่า mock object ของ ILogger<Calc> ให้กับ interface “ILogger”

    // Arrange
    ILogger log = Mock.Of<ILogger<Calc>>();
    ICalc calc = new Calc(log);

    Act

    เราจะดำเนินการ และเรียกใช้ส่วนของ code หรือ method ที่ต้องการทดสอบโดยการผ่านค่า parameter ให้กับ method และเก็บผลลัพธ์ใน valiable ที่กำหนด

    ตัวอย่างด้านล่าง เป็นการเรียกใช้ method “Divide” โดยส่ง parameter ไป 2 ตัว และเก็บผลลัพธ์การทำงานในตัวแปร result

    // Act
    int result = calc.Divide(10, 5);

    Assert

    สุดท้าย จะเป็นการยืนยันว่าผลลัพธ์ที่ได้จากการทดสอบเป็นไปตามที่ได้คาดหวังไว้หรือไม่

    ตัวอย่างด้านล่าง ตัวแปร “result” ควรที่จะมีค่าเท่ากับ 2

    // Assert
    Assert.AreEqual(2, result);

    การตั้งชื่อ

    เมื่อแนวคิดของ ‘AAA’ เป็นแนวปฏิบัติที่ได้รับความนิยม แต่ในส่วนของการกำหนดชื่อของ method ยังคงแตกต่างกันไปและขึ้นอยู่กับผู้พัฒนา ทีม และองค์กร ซึ่งการกำหนดแนวทางการตั้งชื่อเพื่อใช้กับ unit tests ให้มีความสอดคล้องและความชัดเจน ไปในทางเดียวกัน เป็นความคิดที่ดี ซึ่งการตั้งชื่อควรประกอบไปด้วย

    • method ที่ทดสอบ (เช่น ‘Add’)
    • คำอธิบายสั้น ๆ เกี่ยวกับการทดสอบ (เช่น ‘ShouldThrowArgumentException’)
    • ความคาดหวังของการทดสอบนี้ (เช่น ‘IfDivideByZero’)
    public void Divide_ShouldThrowArgumentException_IfDivideByZero()
    {
        ...
    }

    การกำหนดชื่อในรูปแบบนี้ จะเหมาะสำหรับการดูใน Text Explorer ซึ่งสามารถติดตามและเข้าใจได้อย่างง่ายดายว่า unit tests แต่ละหน่วยคืออะไรโดยไม่ต้องเปิดการทดสอบหน่วย

    แนวทางการเขียน Unit Tests ที่ดีสำหรับ C # ยังไม่หมดเพียงเท่านี้ ในบทความต่อไป เราจะมาดูการทำ Test Initialize & Cleanup และ ตัวช่วยอื่นๆที่ใช้ในการเขียน unit tests

    อ้างอิง : https://kiltandcode.com/2019/06/16/best-practices-for-writing-unit-tests-in-csharp-for-bulletproof-code/