Theo cách tôi thấy, cả hai bạn đều có lợi thế và bạn đang ở thế "bất lợi" (sic).
Ưu điểm là bạn có một hệ thống mà bạn cảm thấy thoải mái và phù hợp với bạn. Bạn rất vui khi nó xác nhận tính hợp lệ của sản phẩm của bạn và có lẽ bạn sẽ không tìm thấy giá trị kinh doanh nào khi cố gắng thay đổi tất cả các thử nghiệm của mình cho một thứ sử dụng khung khác. Nếu bạn có thể cấu trúc lại mã của mình và các thử nghiệm của bạn sẽ nhận được các thay đổi - hoặc tốt hơn nữa, nếu bạn có thể sửa đổi các thử nghiệm của mình và mã hiện tại của bạn thất bại các thử nghiệm cho đến khi nó được tái cấu trúc, thì bạn có tất cả các cơ sở của mình. Tuy nhiên...
Một trong những lợi thế của việc có API thử nghiệm đơn vị được thiết kế tốt là có rất nhiều hỗ trợ riêng trong hầu hết các IDE hiện đại. Điều này sẽ không ảnh hưởng đến những người dùng VI và những người dùng khó tính ngoài kia đã chế nhạo những người dùng Visual Studio ngoài kia, nhưng đối với những người sử dụng sử dụng một IDE tốt, bạn có khả năng gỡ lỗi các bài kiểm tra của mình và thực hiện chúng trong IDE chính nó. Điều này là tốt, tuy nhiên có một lợi thế thậm chí còn lớn hơn tùy thuộc vào khung bạn sử dụng và đó là ngôn ngữ được sử dụng để kiểm tra mã của bạn.
Khi tôi nói ngôn ngữ , tôi không nói về ngôn ngữ lập trình, mà thay vào đó tôi đang nói về một từ có tập hợp phong phú được gói gọn trong một cú pháp trôi chảy khiến mã kiểm tra đọc giống như một câu chuyện. Đặc biệt, tôi đã trở thành một người ủng hộ việc sử dụng các khung BDD . API DotNet BDD yêu thích của tôi là StoryQ, nhưng có một số mục đích khác có cùng mục đích cơ bản, đó là lấy một khái niệm ra khỏi tài liệu yêu cầu và viết nó theo mã tương tự như cách nó được viết trong thông số kỹ thuật. Tuy nhiên, các API thực sự tốt thậm chí còn đi xa hơn, bằng cách chặn mọi câu lệnh riêng lẻ trong một bài kiểm tra và cho biết liệu câu lệnh đó được thực hiện thành công hay thất bại. Điều này cực kỳ hữu ích, vì bạn có thể thấy toàn bộ thử nghiệm được thực hiện mà không cần quay lại sớm, điều đó có nghĩa là các nỗ lực sửa lỗi của bạn trở nên cực kỳ hiệu quả vì bạn chỉ cần tập trung sự chú ý vào các phần của thử nghiệm thất bại, mà không cần phải giải mã toàn bộ cuộc gọi sự nối tiếp. Một điều tuyệt vời khác là đầu ra thử nghiệm cho bạn thấy tất cả các thông tin này,
Để làm ví dụ về những gì tôi đang nói, hãy so sánh như sau:
Sử dụng khẳng định:
Assert(variable_A == expected_value_1); // if this fails...
Assert(variable_B == expected_value_2); // ...this will not execute
Assert(variable_C == expected_value_3); // ...and nor will this!
Sử dụng API BDD trôi chảy:
(Hãy tưởng tượng rằng các bit in nghiêng về cơ bản là các con trỏ phương thức)
WithScenario("Test Scenario")
.Given(*AConfiguration*) // each method
.When(*MyMethodToTestIsCalledWith*, variable_A, variable_B, variable_C) // in the
.Then(*ExpectVariableAEquals*, expected_value_1) // Scenario will
.And(*ExpectVariableBEquals*, expected_value_2) // indicate if it has
.And(*ExpectVariableCEquals*, expected_value_3) // passed or failed execution.
.Execute();
Bây giờ được cấp cú pháp BDD dài hơn và dài hơn, và các ví dụ này bị chiếm dụng khủng khiếp, tuy nhiên đối với các tình huống kiểm tra rất phức tạp khi có nhiều thứ đang thay đổi trong một hệ thống do một hành vi hệ thống nhất định, cú pháp BDD cung cấp cho bạn rõ ràng mô tả về những gì bạn đang thử nghiệm và cách xác định cấu hình thử nghiệm của bạn và bạn có thể hiển thị mã này cho người không lập trình và họ sẽ hiểu ngay những gì đang diễn ra. Ngoài ra, nếu "biến_A" không thực hiện kiểm tra trong cả hai trường hợp, ví dụ Xác nhận sẽ không thực hiện quá trình xác nhận đầu tiên cho đến khi bạn đã khắc phục sự cố, trong khi đó, API BDD sẽ thực thi mọi phương thức được gọi trong chuỗi, và chỉ ra các phần riêng lẻ của tuyên bố đã bị lỗi.
Cá nhân tôi thấy cách tiếp cận này hoạt động tốt hơn nhiều so với các khung xUnit truyền thống hơn theo nghĩa là ngôn ngữ kiểm tra là ngôn ngữ giống như khách hàng của bạn sẽ nói về các yêu cầu logic của họ. Mặc dù vậy, tôi đã quản lý để sử dụng các khung xUnit theo kiểu tương tự mà không cần phải phát minh ra API thử nghiệm hoàn chỉnh để hỗ trợ các nỗ lực của mình và trong khi các xác nhận vẫn sẽ tự ngắt mạch một cách hiệu quả, chúng đọc sạch hơn. Ví dụ:
Sử dụng Nunit :
[Test]
void TestMyMethod()
{
const int theExpectedValue = someValue;
GivenASetupToTestMyMethod();
var theActualValue = WhenIExecuteMyMethodToTest();
Assert.That(theActualValue, Is.EqualTo(theExpectedValue)); // nice, but it's not BDD
}
Nếu bạn quyết định khám phá bằng cách sử dụng API thử nghiệm đơn vị, lời khuyên của tôi là hãy thử nghiệm một số lượng lớn các API khác nhau trong một thời gian và để giữ và cởi mở về cách tiếp cận của bạn. Trong khi cá nhân tôi ủng hộ cho BDD, nhu cầu kinh doanh của riêng bạn có thể yêu cầu điều gì đó khác biệt đối với hoàn cảnh của nhóm bạn. Tuy nhiên, điều quan trọng là tránh đoán thứ hai hệ thống hiện tại của bạn. Bạn luôn có thể hỗ trợ các thử nghiệm hiện tại của mình bằng một vài thử nghiệm bằng API khác nếu cần, nhưng tôi chắc chắn sẽ không đề xuất một thử nghiệm khổng lồ viết lại chỉ để làm mọi thứ giống nhau. Khi mã kế thừa không còn sử dụng, bạn có thể dễ dàng thay thế nó và các thử nghiệm của nó bằng mã mới và thử nghiệm bằng API thay thế, và điều này mà không cần đầu tư vào một nỗ lực lớn mà không nhất thiết phải cung cấp cho bạn bất kỳ giá trị kinh doanh thực sự nào. Đối với việc sử dụng API thử nghiệm đơn vị,