2011-01-19 23 views
17

Cách nào đúng để sử dụng Assert.InconclusiveIgnoreAttribute trong khuôn khổ kiểm tra MS Unit?Assert.Inconclusive và IgnoreAttribute

Chúng tôi đang sử dụng Assert.Inconclusive chủ yếu để kiểm tra đó là:

  • Chưa được triển khai chưa
  • Bằng cách nào đó bị hỏng hoặc không đầy đủ = đòi hỏi sự chú ý thêm tác
  • Khi cơ thể kiểm tra được vì lý do bất kỳ nhận xét ra

Chúng tôi đang làm điều này vì:

  • không phân thắng bại thử nghiệm có thể có nhắn
  • Chúng tôi muốn thấy xét nghiệm như vậy trong các kết quả thử nghiệm trên TFS

vấn đề của chúng tôi là Inconclusive kiểm tra được đánh dấu là lỗi trong cả hai TFS và Resharper. Nếu chúng ta sử dụng IgnoreAttribute thay vào đó chúng ta sẽ thấy các xét nghiệm này trong Resharper nhưng MS Test runner và TFS sẽ bỏ qua chúng ở tất cả. Sử dụng IgnoreAttribute trong TFS và MS Test runner giống như bình luận toàn bộ bài kiểm tra đó là vô dụng.

Trả lời

5

Tôi thích suy nghĩ cách bạn mô tả Inconclusive là cách sử dụng phù hợp.

Mặc dù theo kinh nghiệm của tôi, Inconclusive được coi là cảnh báo hơn là lỗi. Trong thực tế, họ được báo cáo trong TRX riêng rẽ với các lỗi:

<TestRun> 
    <ResultSummary outcome="Inconclusive"> 
     <Counters total="1" 
      executed="0" error="0" failed="0" 
      timeout="0" aborted="0" inconclusive="1" 
      passedButRunAborted="0" notRunnable="0" 
      notExecuted="0" disconnected="0" 
      warning="0" passed="0" completed="0" 
      inProgress="0" pending="0" /> 

tôi thường chạy file thực thi MSTest từ một <Exec> nhiệm vụ trong kịch bản msbuild tôi và sau đó nhìn vào bên trong các TRX để xác định liệu có nên không xây dựng .

+0

Vâng, đây là cách giải quyết tốt nhất mà tôi đã đọc về vấn đề này. Tôi đã tạo một mẫu TFS để suy nghĩ được mô tả ở đây được tích hợp vào quá trình xây dựng TFS. http://blog.dbtracer.org/2011/02/27/inconclusive-tests-in-tfs-build-should-not-break-the-build/ –

+0

@PetrKozelek, thật không may, blog của bạn không thể truy cập được –

+0

@PetrKozelek Tôi tìm thấy câu trả lời này, cũng như một bài viết bạn để lại trên blog của Ewald Hoffman đã tham chiếu "Các xét nghiệm không kết luận trong TFS Build không nên phá vỡ bản dựng." Blog của bạn có được lưu trữ ở bất cứ đâu bây giờ không? Tôi muốn xem bạn đã làm gì. – bwerks

3

Tôi đã thực hiện một số nghiên cứu về điều này, cũng như dùng thử tại nhà. Kết quả cuối cùng là tôi tin rằng thuộc tính [Bỏ qua] cho MSTest thực sự đã loại bỏ hoàn toàn phương pháp thử nghiệm. Tôi đã thử nhìn vào các thiết lập trong Visual Studio để xem nếu có một ghi đè, nhưng không thể tìm thấy bất cứ điều gì. Nếu bạn không thấy các bài kiểm tra bị bỏ qua là xấu vì bạn có thể nghĩ rằng bạn có một bộ 100 bài kiểm tra MSTest chạy độc đáo, nhưng hóa ra là có 50 bài kiểm tra bị thiếu trong kết quả mà bạn chưa bao giờ thấy biết về do thuộc tính [Ignore]! Urgh.

2

Cổ điển, khi thử nghiệm, kiểm tra đơn vị phải rất cụ thể để có một (gần) tương ứng một-một giữa các tính năng và kiểm tra cho các tính năng này.

Để kiểm tra một số tính năng nhất định, hệ thống đang được kiểm tra (SUT) trước tiên cần được đưa vào một trạng thái nhất định. Khi đạt được trạng thái đó, thử nghiệm thực sự có thể kiểm tra tính năng mà nó có nghĩa là. Bây giờ, trạng thái của thử nghiệm như thế nào, nếu phần thiết lập không thành công. Nó không thể đưa ra một tuyên bố về chức năng của tính năng đang được kiểm tra, vì thử nghiệm không bao giờ đạt đến trạng thái yêu cầu để thực hiện tính năng này.

Trong trường hợp này, việc gán kết quả không xác định là điều phổ biến, vì chúng tôi không thể biết liệu tính năng có hoạt động bình thường hay không và vì vậy chúng tôi không thể vượt qua hoặc thất bại. Thực tế là bản thân thiết lập không hoạt động như mong đợi sẽ được bao phủ bởi một thử nghiệm riêng biệt.

Vì vậy, hãy tưởng tượng, tôi muốn kiểm tra xem 'foo' đã được 'chặn' sẽ trả lại giá trị 0 khi 'qux'ed. Thử nghiệm này không nên kiểm tra nếu 'foo' có thể được 'bar'ed, vì vậy bất kỳ thất bại để được' bar'ed sẽ trả lại một kết luận, trong khi một thất bại để đáp ứng với 'qux' sẽ thất bại đúng.

11

tôi cũng thấy tình huống khó xử trong quá trình triển khai hiện tại.

  • Inconclusive khẳng định được bao gồm trong báo cáo TRX, nhưng MSTest.exe sẽ trở lại 1 (có nghĩa là lỗi) sau khi thực hiện.
  • TestMethods với thuộc tính Ignore sẽ không được báo cáo là lỗi, nhưng chúng là hoàn toàn ẩn từ báo cáo TRX.

hiểu biết cá nhân của tôi là như sau:

sử dụng [Ignore] thuộc tính (tạm thời) vô hiệu hóa/skip phương pháp:

[TestMethod] 
[Ignore] // <== disabled through "Ignore" attribute 
public void Test001() 
{ 
    //execute some stuff ... 
    Assert.IsTrue(...); 

    //execute some stuff ... 
    Assert.AreEqual(...); 
} 

làm không lạm dụng các Inconclusive khẳng định cho mục đích này:

[TestMethod] 
public void Test002() 
{ 
    Assert.Inconclusive(); // <== misuse of "Inconclusive" to skip this test 

    //execute some stuff ... 
} 

thay vào đó, Inconclusive nên được sử dụng có điều kiện: chỉ khi chúng tôi không thể biết liệu thành phần được kiểm tra có hoạt động như mong đợi hay không.
ví dụ như trong trường hợp một bên ngoài tài nguyên chúng ta phụ thuộc vào không có sẵn tại thời điểm kiểm tra thực hiện:

[TestMethod] 
public void Test003() 
{ 
    //check if the server is running, 
    //otherwise can can't test our local client component! 
    if (!WebServiceAvailable()) 
    { 
     Assert.Inconclusive(); // <== skip remaining code because the resource is not available 
    } 

    //execute some stuff ... 
    Assert.AreEqual(...); 

    //execute some stuff ... 
    Assert.AreEqual(...); 
} 

_ _

kết luận:
để vô hiệu hóa/bỏ qua một bài kiểm tra logic cách là sử dụng thuộc tính [Ignore].
tôi thấy rõ hành vi hiện tại của mstest.exe không báo cáo về bất kỳ thử nghiệm bị bỏ qua nào là lỗi lỗi cần được khắc phục.

cảm thấy tự do để lên bầu các báo cáo lỗi sau:

2

Tính đến tài liệu MSDN:

  1. IgnoreAttribute (kể từ VS 2005) có nghĩa là "kiểm tra này không được chạy" xem https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.ignoreattribute(v=vs.80).aspx.

  2. Khẳng định.Không phân thắng bại (kể từ khi VS 2005) có nghĩa là "Chỉ ra rằng một sự khẳng định không thể được chứng minh đúng hay sai. Cũng được sử dụng để chỉ ra một sự khẳng định rằng vẫn chưa được thực hiện." nhìn thấy https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.inconclusive(v=vs.80).aspx

Tôi nghĩ rằng đây là những thực sự tuyên bố rõ ràng khi bạn phải sử dụng cái nào.

Các vấn đề liên quan