แนวทางการเขียน 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 ที่จะใช้ในการทดสอบ ซึ่งจะถูกเรียกใช้ก่อนการทดสอบจะเริ่มทำงาน Shouldly Assertion Framework Shouldly framework จะช่วยให้ unit test ทำได้ง่ายและเข้าใจได้ง่ายขึ้น มันจะช่วยผู้พัฒนาในการเขียนการยืนยันผลการทำงานของ unit tests ซึ่งเมื่อกลับมาดู unit test อีกครั้งสามารถอ่าน code แล้วเข้าใจวัตถุประสงค์และความคาดหวังของการทดสอบ เปรียบเทียบความแตกต่างระหว่าง การใช้ Shouldly กับ ไม่ใช่ Shouldly With Shouldly Without Shouldly Shouldly สามารถใช้ในการตรวจสอบ exception ว่าเกิดตามที่คาดหวังไว้หรือไม่ และสามารถตรวจสอบ meesage ของ exception ได้ 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 ตัวจริง We can also verify if a mock object was invoked inside a method and the amount of times it was invoked: อ้างอิง : https://kiltandcode.com/2019/06/16/best-practices-for-writing-unit-tests-in-csharp-for-bulletproof-code/

Read More »

แนวทางการเขียน 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” Act เราจะดำเนินการ และเรียกใช้ส่วนของ code หรือ method ที่ต้องการทดสอบโดยการผ่านค่า parameter ให้กับ method และเก็บผลลัพธ์ใน valiable ที่กำหนด ตัวอย่างด้านล่าง เป็นการเรียกใช้ method “Divide” โดยส่ง parameter ไป 2 ตัว และเก็บผลลัพธ์การทำงานในตัวแปร result Assert สุดท้าย

Read More »

เขียน Unit test ทดสอบการทำงานกับฐานข้อมูลที่ใช้ Entity Framework Core

ในบทความนี้ จะนำเสนอการเขียน unit test เพื่อทดสอบการทำงานของ method ที่ใช้งาน Entity Framework Core ซึ่งตัว Entity Framework Core มาพร้อมความสามารถที่สามารถใช้งาน in-memory store ซึ่งสามารถใช้ในการทดสอบได้ หรือจะใช้ mock framework ในการทดสอบก็ได้ โดยในบทความนี้จะแสดงให้เห็นทั้งสองแนวทาง In Memory Database In Memory Database เป็นการสร้าง database จำลองขึ้นมาใช้บน memory แทนที่การใช้ database ตัวจริง ทำให้เราสามาถเขียน unit test โดยที่ไม่ไปกระทบกับ database จริงๆ โดยการเพิ่ม Microsoft.Entityframework.InMemory NuGet package เข้าไปใน test projet ในส่วนของ DbContext class จะต้องมี constructor ที่รับ DbContectOption เป็น parameter จากตัวอย่างด้านบน เราใช้ UseInMemoryDatabase extension method -ของ DbContextOptionsBuilder ซึ่งรับ parameter 1 ตัวเพื่อกำหนดชื่อของ database โดยเราจะใช้ Guid จากนั้นก็สามารถเขียน unit test ได้ดังนี้ จากตัวอย่างด้านบน CreateDbContext method ทำหน้าที่ในการสร้าง DbContext object ที่ทำงานกับ in-memory database แทนที่จะใช้งาน database ตัวจริง หลังจากนั้นก็สามารถทำตามที่ต้องการได้ เหมือนกับการใช้งาน DbContext ปกติ Using Mock Frameworks อีกทางเลือกหนึ่ง เราสามารถใช้ mock frameworks ในการเขียน unit tests ซึ่งเราจะใช้ Moq mock frameworks ซึ่งเป็น mock frameworks ที่ได้รับความนิยมสำหรับ .Net platform โดยก่อนที่จะเริ่มเขียน unit test เราจะต้องกำหนดให้ DbSet pproperty ของ DbContext เป็น virtual ซึงจะทำให้ Moq framework สามารถสร้าง fake object และ override property นี้ได้ และดำเนินการดังนี้ สร้าง generic collection สำหรับ DbSet property แต่ละตัว Config fake DbSet ใน mock framework Setup และ forward DbSet property เหล่านั้นไปที่ generic collection Provider Expression ElementType GetEnumerator() อ้างอิง : https://www.bitiniyan.com/2019/02/02/how-to-write-unit-tests-with-entity-framework-core/

Read More »

SSH:- no matching key exchange method found

เดี๋ยวนี้ใน Windows 10 ก็มี ssh ให้ใช้งาน แต่พอใช้กับเซิร์ฟเวอร์รุ่นเก่าๆ ก็เข้าไม่ได้ซะงั้น ไปลอง ssh ฝั่ง Linux (WSL2) ก็ให้ผลเหมือนกันคือ!!! ถ้าเป็นเมื่อก่อน วิ่งไปหา putty อย่างไว…. แต่ Windows อุตส่าห์ทำมาให้ใช้แล้วทั้งทีจะไม่ใช้ได้ยังไง สิ่งที่ต้องตรวจสอบก่อนคือ man ssh_config สำหรับ Linux ฝั่ง client ว่ารองรับ ciphers และ kexalgorithms แบบไหนรองรับหรือไม่ ส่วนฝั่ง Windows 10 จะอิงตาม OpenBSD manual ซึ่งเหมือนกับ Linux แหละ สร้างแฟ้ม .ssh/config โดย Linux ก็จะให้สร้างที่ /home/username/.ssh/ Windows ก็อยู่ที่ C:\Users\username\.ssh สำหรับ error ว่า no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 ให้เพิ่มข้อความต่อไปนี้ลงในแฟ้ม .ssh/config โดย somhost.example.org เป็นชื่อและโดเมนเนมของ server เป้าหมาย สำหรับ error ว่า no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se ให้เลือกมา 1 cipher ที่ปรากฎใน error มาใส่ในแฟ้ม .ssh/config บาง server ต้องรวมทั้งสองอย่างเช่น ถ้าไม่อยากสร้างแฟ้ม .ssh/config สามารถสั่งผ่าน command line ได้เลยเช่น หรือ ถ้ามี error 2 อย่าง เมื่อสร้างแฟ้ม .ssh/config แล้วลอง ssh เข้าไปใหม่ อ้างอิง https://www.openssh.com/legacy.html https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_server_configuration เย่ไม่ต้องลง putty ละ อย่างไรก็ดี ควรรีบหาทางขยับขยายย้ายเซิร์ฟที่ยังใช้วิธีการเข้ารหัสแบบเก่า ให้เป็นรุ่นใหม่ๆ จะดีและยั่งยืนกว่า จบขอให้สนุก

Read More »

Print หน้าเว็บ Clean Clean ด้วย Print Friendly & PDF

บทความนี้จะมาแนะนำ Extension กันอีกเช่นเคยนะคะ วันนี้ขอนำเสนอ Print Friendly & PDF ค่ะ Extension ที่จะทำให้เรา Print หน้าเว็บที่สนใจได้แบบ Clean Clean และยังสามารถจัดการรูปแบบได้ตามที่ต้องการก่อนพิมพ์ได้ด้วยภาพโฆษณาต่างๆ จะไม่มีให้รก และเรายังสามารถลบข้อความหรือรูปภาพที่ไม่ต้องการออกไปได้ก่อนที่จะพิมพ์ ซึ่งต่างการจาก Print หน้าเว็บแบบเดิมที่เราไม่สามารถจัดการหน้าเว็บก่อนที่จะพิมพ์ได้ Extension ตัวนี้จึงช่วยทำให้เราประหยัดน้ำหมึกและกระดาษที่จะใช้ Print ค่ะ (งานรักษ์โลกก็มา) การใช้งานก็ง่ายมาก ๆ เลยค่ะ ^^ Features มีอะไรบ้าง Print Preview -> ปรับและแสดงเนื้อหาของการพิมพ์ให้เหมาะสมที่สุด Edit Before Printing  – >ปรับแต่งขนาดของรูปภาพ และข้อความ หรือจะลบรูปภาพ ข้อความที่ไม่ต้องการออกไปได้ (เลือกพิมพ์เฉพาะสิ่งที่เราต้องการ) Print or Save as PDF -> Print ทันที หรือจะบันทึกเป็น PDF ไว้ก็ได้ หรือจะส่งอีเมลก็ได้ (น่าจะเพิ่มมาตอนหลังมั้ง) เร่ิ่มจากติดตั้ง Extension ตัวนี้ให้กับ ฺBrowser ของเรากันก่อนนะคะ โดยเมื่อติดตั้งเรียบร้อยแล้วเราก็จะพบว่ามี icon ของ Print Friendly & PDF เขียว ๆ ขึ้นมา ก็เป็นอันติดตั้งส่วนขยายให้กับ Browser ของเราเรียบร้อยแล้วละค่า มาเริ่มใช้งานกันดีกว่าค่ะ วันนี้ผู้เขียนอยากจะ print นิทานไปฝากเด็ก ๆ ค่ะ เจอนิทานบนเว็บ kapook ที่สนใจแล้วค่ะ เรื่อง นิทานดาวลูกไก่ https://baby.kapook.com/view227107.html ไปที่หน้าเว็บที่สนใจจะ Print (หรือใครจะส่ง Email หรือจัดเก็บเป็น PDF ก่อนก็ได้) แล้วก็กด icon ของ Print Friendly & PDF ได้เลยค่ะ เมื่อกด Print Friendly & PDF แล้ว เอกสารจะแสดงขึ้นมาให้ ซึ่งจะเห็นว่า ภาพโฆษณาไม่มีติดมาเลย และได้มีการปรับและแสดงเนื้อหาของการพิมพ์ให้เหมาะสม ซึ่งเราก็ยังสามารถที่จะจัดการเนื้อหาและรูปภาพก่อนที่จะ Print ได้ตามต้องการอีก ดังนี้ ปรับขนาดของตัวอักษร และขนาดของรูปภาพ ลบข้อความ หรือรูปภาพที่ไม่ต้องการออไป หลังจากปรับแต่งตามที่ต้องการ (ผู้เขียนลดขนาดภาพลงหน่อย และลบข้อความบางส่วนออกไป) แล้วก็เป็นอันเสร็จ เราจะสั่ง Print เอกสารเลย หรือจะส่งเป็น Email หรือจะ บันทึกเป็น PDF ก็ได้นะคะ เดีี่ยวลองสั่ง Print นะคะ ผลลัพธ์ก้จะได้ออกมาแบบ นี้ดีงามมาก ๆ เลยละค่า ฮรี่ๆๆ ในส่วนของการส่ง Email และบันทึก PDF ก็ลองไปใช้งานกันดูนะคะ สำหรับบทความนี้ก็ขอจบลงเพียงเท่านี้นะคะ ขอบคุณมากค่ะ จุ๊บบายยย Ref : https://www.printfriendly.com/about

Read More »