Lợi thế quyết định của thử nghiệm đơn vị so với thử nghiệm tích hợp là gì?
Đó là một sự phân đôi giả.
Kiểm thử đơn vị và kiểm thử tích hợp phục vụ hai mục đích tương tự, nhưng khác nhau. Mục đích của kiểm tra đơn vị là để đảm bảo các phương pháp của bạn hoạt động. Trong điều kiện thực tế, các thử nghiệm đơn vị đảm bảo rằng mã hoàn thành hợp đồng được phác thảo bởi các thử nghiệm đơn vị. Điều này thể hiện rõ qua cách các bài kiểm tra đơn vị được thiết kế: chúng nêu cụ thể những gì mã được cho là phải làm và khẳng định rằng mã thực hiện điều đó.
Kiểm tra tích hợp là khác nhau. Kiểm thử tích hợp thực hiện sự tương tác giữa các thành phần phần mềm. Bạn có thể có các thành phần phần mềm vượt qua tất cả các thử nghiệm của chúng và vẫn thất bại trong các thử nghiệm tích hợp vì chúng không tương tác đúng.
Tuy nhiên, nếu có một lợi thế quyết định đối với các bài kiểm tra đơn vị, thì đó là: các bài kiểm tra đơn vị dễ cài đặt hơn nhiều và đòi hỏi ít thời gian và công sức hơn nhiều so với các bài kiểm tra tích hợp. Khi được sử dụng đúng cách, các bài kiểm tra đơn vị khuyến khích phát triển mã "có thể kiểm tra", có nghĩa là kết quả cuối cùng sẽ đáng tin cậy hơn, dễ hiểu hơn và dễ bảo trì hơn. Mã có thể kiểm tra có một số đặc điểm nhất định, như API mạch lạc, hành vi lặp lại và nó trả về kết quả dễ xác nhận.
Kiểm tra tích hợp là khó khăn hơn và tốn kém hơn, bởi vì bạn thường cần chế giễu phức tạp, thiết lập phức tạp và xác nhận khó khăn. Ở mức độ tích hợp hệ thống cao nhất, hãy tưởng tượng cố gắng mô phỏng sự tương tác của con người trong một giao diện người dùng. Toàn bộ hệ thống phần mềm được dành cho loại tự động hóa đó. Và đó là tự động hóa mà chúng ta theo sau; thử nghiệm của con người là không thể lặp lại, và không có quy mô như thử nghiệm tự động.
Cuối cùng, kiểm thử tích hợp không đảm bảo về phạm vi bảo hiểm mã. Có bao nhiêu kết hợp các vòng lặp mã, điều kiện và các nhánh bạn đang kiểm tra với các bài kiểm tra tích hợp của mình? Bạn có thực sự biết? Có những công cụ mà bạn có thể sử dụng với các bài kiểm tra đơn vị và phương pháp được kiểm tra sẽ cho bạn biết mức độ bao phủ của mã và mức độ phức tạp theo chu kỳ của mã của bạn. Nhưng chúng chỉ thực sự hoạt động tốt ở cấp độ phương thức, nơi các bài kiểm tra đơn vị sống.
Nếu các bài kiểm tra của bạn thay đổi mỗi khi bạn tái cấu trúc, thì đó là một vấn đề khác. Các bài kiểm tra đơn vị được cho là về việc ghi lại những gì phần mềm của bạn làm, chứng minh rằng nó làm điều đó, và sau đó chứng minh rằng nó làm điều đó một lần nữa khi bạn cấu trúc lại việc triển khai cơ bản. Nếu API của bạn thay đổi hoặc bạn cần các phương thức của mình thay đổi theo sự thay đổi trong thiết kế hệ thống, đó là điều sẽ xảy ra. Nếu nó xảy ra nhiều, hãy xem xét việc viết bài kiểm tra của bạn trước, trước khi bạn viết mã. Điều này sẽ buộc bạn phải suy nghĩ về kiến trúc tổng thể và cho phép bạn viết mã với API đã được thiết lập.
Nếu bạn đang dành nhiều thời gian để viết bài kiểm tra đơn vị cho mã tầm thường như
public string SomeProperty { get; set; }
sau đó bạn nên xem xét lại cách tiếp cận của bạn. Kiểm thử đơn vị được cho là để kiểm tra hành vi và không có hành vi nào trong dòng mã ở trên. Tuy nhiên, bạn đã tạo ra một sự phụ thuộc trong mã của mình ở đâu đó, vì thuộc tính đó gần như chắc chắn sẽ được chuyển đến nơi khác trong mã của bạn. Thay vì làm điều đó, hãy xem xét các phương thức viết chấp nhận thuộc tính cần thiết làm tham số:
public string SomeMethod(string someProperty);
Bây giờ phương thức của bạn không có bất kỳ sự phụ thuộc nào vào một cái gì đó bên ngoài nó, và giờ đây nó có thể kiểm chứng hơn, vì nó hoàn toàn khép kín. Cấp, bạn sẽ không thể luôn làm điều này, nhưng nó sẽ di chuyển mã của bạn theo hướng dễ kiểm tra hơn và lần này bạn đang viết một bài kiểm tra đơn vị cho hành vi thực tế.