2011-11-23 32 views
5

Tôi đang viết nhiều bài kiểm tra đơn vị trong VS 2010 với Microsoft Test. Trong mỗi lớp kiểm tra, tôi có nhiều phương pháp thử nghiệm tương tự như dưới đây:Cách tốt nhất để tránh thử ... bắt ... cuối cùng ... trong thử nghiệm đơn vị của tôi là gì?

[TestMethod] 
public void This_is_a_Test() 
{ 
    try 
    { 
    // do some test here 
    // assert 
    } 
    catch (Exception ex) 
    { 
    // test failed, log error message in my log file and make the test fail 
    } 
    finally 
    { 
    // do some cleanup with different parameters 
    } 
} 

Khi mỗi phương pháp thử nghiệm trông như thế này tôi rơi thì nó xấu xí. Nhưng cho đến nay tôi đã không tìm thấy một giải pháp tốt để làm cho mã thử nghiệm của tôi sạch sẽ hơn, đặc biệt là mã dọn dẹp trong khối cuối cùng. Ai đó có thể cho tôi một số lời khuyên về điều này?

Xin cảm ơn trước.

Trả lời

6

Nếu bạn thực sự muốn xử lý và đăng nhập ngoại lệ khi thực hiện kiểm tra, bạn có thể quấn lên mẫu tiêu chuẩn này trong một phương pháp helper và sử dụng như hiển thị dưới đây [*].

Nhưng nếu trường hợp ngoại lệ là một phần của test này là cách tiếp cận sai lầm và bạn nên sử dụng cơ sở vật chất được cung cấp bởi một khuôn khổ kiểm tra, ví dụ NUnit cung cấp người giúp đỡ như vậy để kiểm tra trường hợp ngoại lệ:

Assert.Throws<ExceptionType>(() => { ... code block... }); 
Assert.DoesNotThrow(() => { ... code block... }); 

Và để làm sạch đặc biệt các thuộc tính của phương thức như [TestCleanup][TestInitialize] để tự động khởi động thử nghiệm và dọn dẹp bằng khung kiểm tra.

[*] Ý tưởng là để bọc cơ thể thử nghiệm trong một đại biểu và thông qua vào helper mà thực sự thực hiện thực hiện kiểm tra bọc trong khối try/catch:

// helper 
public void ExecuteTest(Action test) 
{ 
    try 
    { 
    test.Invoke(); 
    } 
    catch (Exception ex) 
    { 
    // test failed, log error message in my log file and make the test fail 
    } 
    finally 
    { 
    // do some cleanup with different parameters 
    } 
} 

[TestMethod] 
public void This_is_a_Test_1() 
{ 
    Action test =() => 
    { 
     // test case logic 
     // asserts 
    }; 

    this.ExecuteTest(test); 
} 
+0

Cảm ơn câu trả lời, tôi sẽ thử giải pháp. –

1

Xóa tất cả thử-catch- cuối cùng (đặc biệt là bắt không chỉ không cần thiết, nhưng thậm chí có hại, bạn không nên bắt ngoại lệ khi thử nghiệm) và làm sạch trong tearDown phương pháp (tuy nhiên là nó được thực hiện trong MS Test, tôi sẽ đoán sẽ có một cái gì đó như [TearDownMethod] hoặc [ FixtureTearDown] hoặc một cái gì đó như thế).

+0

Tôi cần cuối cùng chặn để làm sạch ít nhất vì mỗi phương pháp thử nghiệm có một cái gì đó khác nhau để làm sạch. –

+0

Trường hợp đó, có. Nếu bạn cần làm sạch ở tất cả. Kiểm tra chạy trong tách. Và nếu bạn khéo léo tách chúng thành đồ đạc, nơi bạn thiết lập chung và làm sạch thông thường, bạn hiếm khi cần mẫu này. Tôi nói với bạn từ kinh nghiệm của tôi. Bạn có thể cho tôi một ví dụ về những gì bạn cần để làm sạch? (và tôi hy vọng bạn hiểu rằng các ngoại lệ không được thiết kế để bị bắt được ghi lại bằng tay, nhưng chúng được thiết kế để để kiểm tra Á hậu để bắt chúng và xem đó có phải là lỗi hay không, vì vậy các phần 'bắt' đã thực sự chống lại cách kiểm thử đơn vị có ý nghĩa như thế nào). –

+0

Trong khối catch Tôi muốn đăng nhập các thông báo lỗi ở một vị trí trung tâm mà tôi đã xác định để xem xét. Trong khối cuối cùng tôi cần phải làm sạch một số dữ liệu được tạo động trong cơ sở dữ liệu. Chỉ có một vài dữ liệu chung cho một số phương pháp thử nghiệm. –

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