Unit Testing Strategy (edit)
Bài viết này tôi xin giới thiệu việc viết Unit Testing sử dụng TDD, DI, Dapper, Moq, Moq.Dapper, MSTest với XML
- Build C# classes for any existing database (POCO)
- Build C# result classes for any SQL query
- Moq.Dapper: Unit Testing sử dụng Dapper
- Dapper.QX: Unit Testing sử dụng Dapper
- FakeItEasy & FluentValidation
- Moq Repository với ADO.NET (ở cuối bài)
A WinForms SQL client for generating C# query result classes, Dapper productivity
UnoSD/Moq.Dapper: Moq extensions for Dapper methods. (github.com)
Không nên tạo static method với static class khi viết Unit Testing
unit testing - Fake Captcha from commonlibnet with FakeItEasy and FluentValidation - Stack Overflow
Chiến lược thực hiện
- Bước 1: Tạo kế hoạch kiểm thử
- Bước 2: Tạo các trường hợp thử nghiệm và dữ liệu thử nghiệm
- Bước 3: Tạo tập lệnh để chạy các trường hợp thử nghiệm nếu có thể
- Bước 4: Thực hiện các trường hợp thử nghiệm, khi mã đã sẵn sàng
- Bước 5: Sửa các lỗi nếu có và kiểm tra lại mã
- Bước 6: Lặp lại chu kỳ kiểm tra cho đến khi không còn các loại lỗi nữa
Tiêu chí nghiệm thu
- Code Unit Testing phải đơn giản, dễ hiểu với các lập trình viên khác (OOP, SOLID)
- Code Unit Testing phải code trước khi tạo ra Codebase được tạo ra (TDD)
- Code Coverage phải đạt tối thiểu 75/100 tức là viết 100 dòng code thì code Unit Testing phải chạy qua 75 dòng
- Database Testing: Unit Testing trên các thao tác CRUD (Không bao gồm Big Data Testing và Functional Testing)
- Sử dụng công cụ tự động sinh ra class tương ứng với các bảng trong cơ sở dữ liệu một cách nhanh chóng (POCO)
Ngôn ngữ lập trình
Sử dụng ngôn ngữ lập trình CSharp trên nền tảng .NET Framework 4.6.1 và Visual Studio 2019 Enterprise chạy trên Windows 10 phiên bản mới nhất
Ví dụ đơn giản: Developer Points: C# Unit Testing: How to write unit test in C# with Moq (rajeevdotnet.blogspot.com)
Chiến lược tạo dữ liệu
Tạo các dữ liệu có sẵn dưới dạng tệp XML, để phản ánh các thực thể trong cơ sở dữ liệu, để tải lên ở phần khởi tạo dữ liệu khi chạy kiểm thử
Công cụ
Sử dụng các công cụ sau:
- Visual Studio 2019 Enterprise
- EntityFramework Reverse POCO Generator
- Unit testing C# with MSTest and .NET
- Test Explorer
- Dapper
- Moq
- Moq.Dapper
- Dapper.QX: More powerful and testable inline SQL used with Dapper adamfoneil/Dapper.QX: More powerful and testable inline SQL used with Dapper (github.com)
- FakeItEasy: The easy mocking library for .NET http://fakeiteasy.github.io
- XML Serialization and Deserialization
- Selenium
- To help you build C# result classes for any SQL query, I offer a free tool Postulate.Zinger.
Tham khảo:
Dapper knowledge Base | Dapper Tutorial and Documentation (dapper-tutorial.net)
Unit Test Dapper with DapperParameters - Intertech Blog
The Fastest Way To Mock a Database for Unit Testing
The Fastest Way To Mock a Database for Unit Testing | DanylkoWeb
XML Serialization and Deserialization
Serialization/Deserialization Series: XML | DanylkoWeb
A simple UI to allow you to easily select which tables you want the EntityFramework Reverse POCO Code First Generator to use
The Dapper readme has no info on unit testing, and suprisingly there is not much tutorials online either.
The two main unit test libraries I was able to find were:
- DapperWrapper (not updated since 2014!!! Does it still work?)
- Moq.Dapper (requires .net core v2, but many people are still on VS2015+.net 4.6.2 or lesser)
When I google "unit test dapper" my top three results are:
- https://mikhail.io/2016/02/unit-testing-dapper-repositories <- requires in-memory db
- this stackoverflow <- also requires in-memory db
- https://www.intertech.com/Blog/unit-test-dapper-with-dapperparameters/ <- 2015 article promoting a library with only three stars
The dapper repo, meanwhile, appears to have integration tests using a actual database. While having a database for integration tests is ideal, it should also be possible to mock the connection so a database is not required.
Creating a Repository Pattern without an ORM | DanylkoWeb