2012-03-14 25 views
11

Tôi tự hỏi thực hành tốt nhất là gì để khởi tạo các biến mẫu trong một lớp thử nghiệm dưới MSTest. Hãy nói rằng tôi có một lớp thử nghiệm, nơi có rất nhiều chi phí để chế nhạo và thiết lập các đối tượng hỗ trợ. Tôi chỉ muốn làm điều này một lần, thay vì lặp lại cùng một mã trong mỗi bài kiểm tra. Suy nghĩ của tôi là sử dụng phương thức MyClassInitialize để khởi tạo một số biến mẫu toàn cục mà tất cả các thử nghiệm đều có quyền truy cập. Bằng cách đó, tôi khởi tạo các biến cá thể toàn cục một lần và chúng chỉ được sử dụng bởi mỗi kiểm thử khi chúng chạy.MSTest, MyClassInitialize và các biến mẫu

Thật không may, phương pháp MyClassInitialize là tĩnh, vì vậy không thể khởi tạo biến mẫu toàn cục. Tôi nghĩ về việc biến các biến toàn cầu tĩnh, nhưng dường như không phải là giải pháp đúng. Tôi tiếp theo nghĩ về việc chỉ đặt mã khởi tạo trong một hàm tạo của lớp thử nghiệm, nhưng một cái gì đó bên trong tôi tiếp tục nói rằng MyClassInitialize là thứ mà tôi cho là đang sử dụng. Một suy nghĩ khác là sử dụng MyTestInitialize vì phương thức đó không tĩnh, nhưng điều đó sẽ tạo ra đối tượng lặp đi lặp lại với mỗi bài kiểm tra. Điều đó có phù hợp không?

Có các phương pháp hay nhất về cách sử dụng các biến trên các thử nghiệm trong đó các biến đó chỉ cần được khởi tạo một lần trước khi chạy thử nghiệm không? Dưới đây là một ví dụ giả tạo về những gì tôi đang nói đến.

[TestClass()] 
public class ProgramTest 
{ 
    // this object requires extensive setup so would like to just do it once 
    private SomeObjectThatIsUsedByAllTestsAndNeedsInitialization myObject; 
    private TestContext testContextInstance; 

    [ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     // initializing SomeObjectThatIsUsedByAllTestsAndNeedsInitialization clearly will 
     // not work here because this method is static. 
    } 

    [TestMethod()] 
    public void Test1() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test2() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test3() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 
} 

Trả lời

8

Sử dụng [TestInitialize] và [TestCleanup] bất cứ khi nào có thể. Một bài kiểm tra đơn vị nên được nhanh chóng và bị cô lập, vì vậy cách sạch nhất là khởi tạo và dọn dẹp cho mỗi bài kiểm tra. Điều này đảm bảo kết quả của một thử nghiệm không bị ảnh hưởng bởi một thử nghiệm khác. Khi khởi tạo một bài kiểm tra mất nhiều thời gian, bạn có thể không đánh giá một bài kiểm tra đơn vị mà là một bài kiểm tra tích hợp.

Ngoại lệ là kiểm tra tích hợp đi đến cơ sở dữ liệu hoặc tài nguyên khác, có thể bạn muốn thực hiện thao tác một lần và sau đó xác minh kết quả với nhiều xác nhận (TestMethods). Tôi đã từng có một lớp chung chung cụ thể với một kiểu ngữ cảnh chỉ được khởi tạo một lần cho mỗi lớp. Nhưng bây giờ tôi nghĩ rằng điều này là quá mức cần thiết, và chỉ cần đặt các phụ thuộc và kết quả trong các biến tĩnh riêng.

1

Bạn có thể sử dụng khởi tạo lười biếng của một biến mẫu trong một số lớp khác. Đừng quên rằng MSTest sẽ tạo ra một cá thể mới của lớp thử nghiệm cho mỗi phương thức thử mà nó chạy. Vì vậy, bất kỳ biến nào trong lớp mà bạn muốn tồn tại trên các phương thức thử nghiệm đều tốt hơn là tĩnh.

3

Vấn đề của bạn với tĩnh là gì?

Nếu ObjectThatIsUsedByAllTests của bạn có thể thực sự 100% được chia sẻ giữa tất cả các thử nghiệm của bạn sau đó làm cho nó tĩnh và sử dụng ClassInitialize - đó là những gì nó cho.

Nếu không thì bạn phải khởi tạo nó cho mỗi thử nghiệm, đó là những gì TestInitialize là cho.

+1

Không thể định lượng được vấn đề của tôi với tĩnh. Nó chỉ không "cảm thấy" đúng, nhưng tôi không thể giải thích tại sao. – meyousikmann

+0

Tĩnh nghĩa là thuộc sở hữu của lớp. Những thứ không tĩnh được sở hữu bởi các thể hiện của lớp. Khi cố gắng xác định xem một thứ có nên tĩnh hay không, hãy tự hỏi 'Đây có phải là toàn bộ lớp học hay chỉ là một thể hiện?' – Tristan

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