2008-10-10 26 views
9

Tôi đang sử dụng MSTEST bên trong Visual Studio 2008. Làm thế nào tôi có thể có mỗi phương pháp thử nghiệm đơn vị trong một hành động lớp thử nghiệm nhất định như thể nó là thử nghiệm đầu tiên để chạy sao cho tất cả trạng thái toàn cục được đặt lại trước khi chạy từng thử nghiệm? Tôi không muốn một cách rõ ràng làm sạch thế giới sử dụng TestInitialize, ClassInitialize, AssemblyInitialize, vv Ví dụ:Làm thế nào để buộc một MSTEST TestMethod để thiết lập lại tất cả các đơn/statics trước khi chạy?

[TestClass] 
public class MyClassTests 
{ 
    [TestMethod] 
    public void Test1() 
    { 
     // The "Instance" property creates a new instance of "SomeSingleton" 
     // if it hasn't been created before. 
     var i1 = SomeSingleton.Instance; 
     ... 
    } 
    [TestMethod] 
    public void Test2() 
    { 
     // When I select "Test1" and "Test2" to run, I'd like Test2 
     // to have a new AppDomain feel so that the static variable inside 
     // of "SomeSingleton" is reset (it was previously set in Test1) on 
     // the call to ".Instance" 
     var i2 = SomeSingleton.Instance; 
     // some code 
    } 

Mặc dù một similar question xuất hiện về chủ đề này, nó chỉ rõ rằng các xét nghiệm không chạy song song. Tôi nhận ra rằng các thử nghiệm chạy serially, nhưng dường như không có cách nào để buộc một AppDomain mới cho mỗi phương thức (hoặc một cái gì đó tương đương với xóa tất cả trạng thái). Lý tưởng nhất, tôi muốn chỉ định hành vi này cho một tập hợp con nhỏ của các bài kiểm tra đơn vị của tôi để tôi không phải trả tiền phạt của một tạo AppDomain mới cho các bài kiểm tra mà không quan tâm đến trạng thái toàn cầu (phần lớn các bài kiểm tra của tôi).

Trả lời

6

Cuối cùng, tôi đã viết một trình trợ giúp sử dụng AppDomain.CreateDomain và sau đó sử dụng phản chiếu để gọi kiểm tra đơn vị theo một AppDomain khác. Nó cung cấp sự cô lập tôi cần.

This post trên diễn đàn của MSDN cho biết cách xử lý tình huống nếu bạn chỉ có một vài số liệu thống kê cần được đặt lại. It không đề cập đến một số tùy chọn (ví dụ: sử dụng Reflection và PrivateType).

Tôi tiếp tục hoan nghênh thêm bất kỳ ý tưởng nào, đặc biệt nếu tôi thiếu điều gì đó rõ ràng về MSTEST.

+2

bạn có ví dụ về mã Jeff không? – DevDave

+1

Có, một mẫu mã xin vui lòng – Harindaka

0

Chúng tôi gặp sự cố tương tự phát sinh với MST của chúng tôi. Chúng tôi xử lý nó bằng cách gọi một hàm ở đầu và cuối của các bài kiểm tra cụ thể cần thiết.

Chúng tôi đang lưu trữ ngày hết hạn thử nghiệm trong cấu hình ứng dụng của chúng tôi. Ba thử nghiệm cần thiết ngày này để rơi vào một phạm vi cụ thể để xác định các giá trị thích hợp. Cách ứng dụng của chúng tôi được thiết lập, các giá trị cấu hình sẽ chỉ được đặt lại nếu không có giá trị được gán trong phiên. Vì vậy, chúng tôi đã tạo hai hàm tĩnh riêng tư mới - một để đặt rõ ràng giá trị cấu hình cho một ngày cụ thể và một để xóa ngày đó khỏi phiên sau khi chạy thử nghiệm. Trong ba thử nghiệm của chúng tôi, chúng tôi gọi hai hàm này. Khi chạy thử nghiệm tiếp theo, ứng dụng sẽ thấy một giá trị rỗng cho ngày đó và nạp lại nó từ tệp cấu hình.

Tôi không chắc liệu điều đó có hữu ích hay không, nhưng đó là cách chúng tôi giải quyết vấn đề tương tự.

+0

Dường như bạn có thể sử dụng [TestInitialize] trong lớp thi của bạn? –

0

Tôi nghĩ bạn đang tìm thuộc tính TestIntialize và thuộc tính TestCleanUp. Đây là một blog MSDN hiển thị thứ tự thực hiện link text

+0

Cảm ơn câu trả lời. Tôi đang tìm kiếm thứ gì đó sẽ dọn sạch thế giới mà không cần phải rõ ràng từng biến, nhưng tôi không chắc liệu điều đó có thể xảy ra hay không. –

3

Thêm trợ giúp trong các thử nghiệm sử dụng phản chiếu để xóa cá thể đơn (bạn cũng có thể thêm phương thức đặt lại vào singleton, nhưng tôi sẽ lo ngại về việc sử dụng nó). Một cái gì đó như:

public static class SingletonHelper { 
      public static void CleanDALFactory() 
      { 
        typeof(DalFactory) 
         .GetField("_instance",BindingFlags.Static | BindingFlags.NonPublic) 
         .SetValue(null, null); 
      } 
} 

Gọi điều này bằng phương pháp TestInitialize của bạn. [Tôi biết điều này là "làm sạch thế giới", nhưng bạn chỉ phải viết phương pháp một lần trong một người trợ giúp mỗi singleton, nó rất tầm thường và cho bạn kiểm soát rõ ràng]

+0

Cảm ơn câu trả lời. Tôi nghĩ rằng tôi sẽ phải sử dụng một sự kết hợp của Reflection để lặp qua các trường tĩnh và gần như những gì bạn mô tả ở đây. Một cái gì đó giống như một "NullifyStaticFields (Type t)" để làm cho nó có thể tái sử dụng –

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