2010-03-25 35 views
17

Sử dụng Visual Studio tạo lớp Kiểm tra Đơn vị. Sau đó, bình luận trong, phương thức khởi tạo lớp. Bên trong nó thêm thuộc tính của bạn, sử dụng đối số testContext.Có phải TestContext.Properties có thể sử dụng được không?

Khi khởi động ứng dụng thử nghiệm, phương pháp này thực sự được gọi là cơ sở hạ tầng kiểm tra.

//Use ClassInitialize to run code before running the first test in the class 
[ClassInitialize()] 
public static void MyClassInitialize(TestContext testContext) 
{ 
    /* 
    * Any user defined testContext.Properties 
    * added here will be erased after this method exits 
    */ 
    testContext.Properties.Add("key", 1) ; // place the break point here 
} 

Sau khi rời khỏi MyClassInitialize, bất kỳ thuộc tính nào do người dùng thêm đều bị mất. Chỉ còn lại 10 "chính thức".

Trên thực tế, TestContext bị ghi đè, với bản inital chính thức, mỗi lần trước khi mỗi phương pháp thử nghiệm được gọi. Nó không chỉ ghi đè nếu người dùng có phương pháp khởi tạo thử nghiệm, các thay đổi được thực hiện trên đó được chuyển đến thử nghiệm.

//Use TestInitialize to run code before running each test 
[TestInitialize()]public void MyTestInitialize(){ 
    this.TestContext.Properties.Add("this is preserved",1) ; 
} 

Điều này có nghĩa là TestContext.Properties là "chủ yếu" chỉ đọc cho người dùng. Mà không được ghi rõ trong MSDN.

Dường như với tôi đây là thiết kế rất lộn xộn + triển khai. Tại sao có TestContext.Properties như một bộ sưu tập, ở tất cả? Người dùng có thể thực hiện nhiều giải pháp khác để khởi tạo lớp rộng.

+2

Tôi chưa bao giờ hiểu mục đích của ngữ cảnh thử nghiệm mà tôi thực sự sử dụng. –

+0

Mục đích được giải thích trong https://blogs.msdn.microsoft.com/vstsqualitytools/2006/01/09/using-testcontext-in-unit-tests/ –

Trả lời

1

Tôi tin rằng bạn phải duy trì một bản sao của testContext hoặc nó sẽ rơi ra khỏi phạm vi.

Tôi nói thêm:

private TestContext _tc; 

và thêm vào Initialize

tc = testContext; 

Khi tôi nhìn vào tc từ một trong các bài kiểm tra nó chứa thuộc tính mới được bổ sung.

+2

Điều này sẽ không hoạt động trong ngữ cảnh của một lớp Bài kiểm tra được tạo bởi Visual Studio. Một cộng hưởng rất rõ ràng là phương thức khởi tạo trong bài viết ban đầu của tôi là tĩnh. Như được tạo ra bởi Visual Studio. –

11

TestContext là duy nhất cho mỗi thử nghiệm để khởi tạo nó trong ClassInitialize sẽ không hoạt động. Bạn chỉ nên sử dụng nó cho các phương thức TestInitialize, TestCleanup và TestMethod.

This post thực hiện tốt công việc giải thích cách các bài kiểm tra từ một lớp được chạy bao gồm luồng.

Điều đó đang được nói, tôi chưa tìm thấy cách sử dụng nào cho TestContext nhưng tôi mới sử dụng MSTest. Tôi đồng ý các tài liệu MSDN là khó hiểu. Có tất cả các phương thức mẫu ghi vào bàn điều khiển hoặc ném lên một hộp thông báo không có gì để biểu diễn các khả năng.

+1

đã đồng ý, nhưng ... điểm tôi đang làm là (tồi tệ hơn) thực hiện là khó hiểu vì (tồi tệ hơn nhiều) nó được dựa trên một desing đó là nhầm lẫn. Kết quả là lỗi đang được bán dưới dạng "tính năng". –

+0

Tôi không biết về trạng thái của sự vật hai năm trước đây, nhưng phương pháp thêm thuộc tính trong TestInitialize không hoạt động. Một ngoại lệ được ném với thông báo "Một mục có cùng khóa đã được thêm".Vì vậy, ClassInitialize được thông qua một TestContext hoàn toàn khác nhau, nhưng tất cả các bài kiểm tra đều có cùng TestContext ... – Amanduh

0

TestContext được sử dụng để chuyển thông tin vào các bài kiểm tra của bạn từ bên ngoài. Thông qua trình kiểm tra thực thi hoặc tệp .runsettings để dữ liệu chung của nó diễn ra theo một cách.

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