2009-03-12 23 views
25

Có thể chạy phương pháp cụ thể trước mỗi bài kiểm tra trong một assembly không?MsTest - phương pháp thi hành trước mỗi bài kiểm tra trong một assembly

Tôi biết về thuộc tính TestInitialize nhưng thuộc tính này có "phạm vi lớp". Nếu nó được định nghĩa trong một lớp Test, nó sẽ được thực thi trước mỗi bài kiểm tra từ lớp này.

Tôi muốn xác định phương thức sẽ được thực hiện trước mỗi thử nghiệm được xác định trong toàn bộ hội đồng.

Trả lời

11

Tôi không chắc chắn rằng tính năng này có thể có trong MsTest ngoài hộp như trong các khuôn khổ thử nghiệm khác (ví dụ: MbUnit).

Nếu tôi phải sử dụng MsTest, thì tôi sẽ giải quyết điều này bằng cách xác định lớp TestBase trừu tượng với thuộc tính [TestInitialize] và mọi kiểm tra cần hành vi này xuất phát từ lớp cơ sở này. Trong trường hợp của bạn, mỗi lớp thử nghiệm trong hội đồng của bạn phải được thừa kế từ cơ sở này ...

Và có lẽ có một giải pháp khác, bạn có thể tạo thuộc tính thử nghiệm tùy chỉnh của mình - nhưng tôi chưa thử điều này ... :)

0

Tôi nghĩ bạn đang tìm kiếm thuộc tính ClassInitialize.

+2

ClassInitialize được thực hiện một lần cho tất cả các lớp. Vì vậy, nếu chúng ta có 5 bài kiểm tra trong lớp, phương thức với ClassInitialize được thực hiện một lần. – brzozow

+2

Vâng, anh ấy có thể có nghĩa là TestInitialize. –

1

Cũng không phải MSTest khởi tạo lớp cho mỗi bài kiểm tra? Đó là sự hiểu biết của tôi về nó. Trong trường hợp như vậy bất cứ điều gì bạn gọi từ constructor của bạn là mã khởi tạo (cho mỗi kiểm tra theo định nghĩa).

EDIT: Nếu nó không hoạt động (mà tôi vẫn nghĩ rằng nó nên vì MSTest cần phải đảm bảo rằng chạy thử phương pháp riêng lẻ được tách biệt) thì TestInitialize là thuộc tính của bạn. Bằng cách so sánh đơn vị thử nghiệm tốt nhất có sẵn tại Link on Codeplex

+0

Tôi muốn viết mã sẽ được thực thi trước tất cả các bài kiểm tra trong tất cả các lớp thử nghiệm. Vì vậy, giải pháp của bạn sẽ chỉ hoạt động trên một lớp kiểm tra – brzozow

+0

Không có điều đó không đúng. Nếu đúng là khai thác MSTest sẽ khởi tạo cá thể lớp thử nghiệm mới cho mỗi phép thử (mà tôi tin là đúng cho mục đích cách ly kiểm tra) thì mã trong constructor chạy trước mỗi phương thức thử nghiệm. –

+0

Đó là những gì bạn viết nhưng nó không giải quyết được vấn đề của tôi. Tôi muốn thiết lập lại một số tính chất tĩnh trước mỗi bài kiểm tra (tôi biết đó là thiết kế xấu). Tôi có 400 lớp học với bài kiểm tra đơn vị. Tôi không muốn viết mã đó trong tất cả các lớp. – brzozow

52

[TestInitialize()] là những gì bạn cần.

private string dir; 

[TestInitialize()] 
public void Startup() 
{ 
    dir = Path.GetTempFileName(); 
    MakeDirectory(ssDir); 
} 

[TestCleanup()] 
public void Cleanup() 
{ 
    ss = null; 
    Directory.SetCurrentDirectory(Path.GetTempPath()); 

    setAttributesNormal(new DirectoryInfo(ssDir)); 
    Directory.Delete(ssDir, true); 
} 


[TestMethod] 
public void TestAddFile() 
{ 
    File.WriteAllText(dir + "a", "This is a file"); 
    ss.AddFile("a"); 
    ... 
} 

[TestMethod] 
public void TestAddFolder() 
{ 
    ss.CreateFolder("a/"); 
    ... 
} 

Điều này tạo ra một đường dẫn tạm thời ngẫu nhiên mới cho mỗi thử nghiệm và xóa nó khi hoàn tất. Bạn có thể xác minh điều này bằng cách chạy nó trong gỡ rối và nhìn vào biến dir cho mỗi trường hợp thử nghiệm.

+3

Phương thức StartUp sẽ được gọi chỉ trước khi thực hiện kiểm tra từ một lớp này. Tôi muốn thực hiện phương pháp trước khi tất cả các bài kiểm tra từ tất cả các lớp trong assembly – brzozow

+1

FTQ "Có thể chạy phương pháp cụ thể trước mỗi bài kiểm tra không?". Tôi trả lời. Nếu ý của bạn là "một phương thức chạy một lần, trước tất cả các thử nghiệm", thì câu trả lời của bạn là ở đây: http://stackoverflow.com/questions/639326/mstest-executing-method-before-each-test/639339#639339 – FryGuy

+1

Thx cho câu trả lời. Nhưng tôi muốn thực thi phương thức trước mỗi bài kiểm tra trong assembly - không phải trước mỗi bài trong một lớp cụ thể. Có lẽ câu hỏi của tôi không đủ rõ ràng. – brzozow

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