Có thể thực thi mã một lần trước khi tất cả các thử nghiệm chạy không?


112

Về cơ bản, tôi muốn yêu cầu MSTest thực thi một chút mã trước khi khởi chạy vào một loạt các lần chạy thử nghiệm, về cơ bản những gì tôi muốn làm cũng giống như việc gắn một số mã vào Main().

Lý do tôi muốn làm điều này là tôi muốn thực hiện một số ghi nhật ký với log4net trong quá trình chạy thử nghiệm tích hợp của mình. Tôi không thể chỉ sử dụng log4net.Config.XmlConfiguratorthuộc tính assembly vì vào thời điểm nó đọc nó trong assembly thử nghiệm của tôi, nó đã được gọi LoggerManager. Tài liệu khuyên bạn nên định cấu hình log4net một cách rõ ràng tại điểm nhập mã - nhưng đó là đâu trong các thử nghiệm của tôi?

Tôi cần có thể chạy thử nghiệm của mình trong TestDriven.NET và Á hậu MSTest.

Câu trả lời:


153

FWIW, bạn có thể sử dụng thuộc tính AssemblyInitialize để chạy mã trước khi tất cả các bài kiểm tra đơn vị trong một hội đồng thực thi:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Nếu bạn có nhiều hơn một cụm kiểm tra đơn vị, tôi không biết bất kỳ thứ gì bao gồm nhiều hơn một cụm.

Theo như tôi được biết, điều này gần như bạn có thể đạt được tương đương Chính.

Lưu ý rằng AssemblyInitializephương thức -decorated phải nằm trong TestClasslớp -decorated chứa ít nhất một TestMethodphương thức -decorated, nếu không, nó sẽ không được thực thi!


1
Tôi đã gặp vấn đề tương tự (chỉ đối với MSTest) và hoạt động tốt. Cảm ơn :)
Oscar Foley

1
Đối với bất kỳ ai khác gặp sự cố khi làm việc này từ cả MsTest và TestDriven.NET, bạn có thể sử dụng cờ tĩnh để xác định xem có chạy mã trong ClassInitialize hay không (điều này không hoạt động trong MsTest).
Carl

7
Lưu ý: Công cụ kiểm tra chỉ chạy phương thức được đánh dấu bằng thuộc tính AssemblyInitialize nếu phương thức đó là thành viên của lớp được đánh dấu bằng thuộc tính TestClass.
Jowen

5
@Jowen: Công cụ kiểm tra chỉ chạy phương thức được đánh dấu bằng thuộc tính AssemblyInitialize nếu phương thức đó là thành viên của lớp được đánh dấu bằng thuộc tính TestClass and contains methods that are marked with the TestMethod attribute.
oɔɯǝɹ

3
Phương thức được đánh dấu bằng AssemblyInitialize sẽ chạy trong Visual Studio 2015 Ultimate mà không có phương thức khác được đánh dấu bằng thuộc tính TestMethod.
Chris

63

Để hoàn thành, đây là các tùy chọn "chạy mã trước" cho MSTest:

  • Sử dụng [AssemblyInitialize]để chạy mã một lần cho mỗi lắp ráp, trước khi bất kỳ thử nghiệm nào trong lắp ráp đó chạy.
  • Sử dụng [ClassInitialize]để chạy mã một lần cho mỗi lớp, trước bất kỳ bài kiểm tra nào trong lớp mà phương thức được xác định.
  • Sử dụng [TestInitialize]để chạy mã trước mỗi và mọi thử nghiệm trong lớp mà phương thức được xác định.

12
Các đối tác dọn dẹp các thuộc tính là hậu tố Cleanup (ví dụ ClassCleanup) cho các hoạt động giọt nước mắt xuống
Yair Nevet

13

Tôi thấy điều này trong tiêu đề MS Test.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Điều này sẽ chạy trước các bài kiểm tra trong một lớp.

Có vẻ như bạn muốn chạy thứ gì đó trước tất cả các bài kiểm tra.

Ngoài ra còn có tùy chọn tập lệnh thiết lập trong cấu hình chạy thử nghiệm.


Trừ khi tôi thiếu thứ gì đó, các tập lệnh thiết lập không giúp chạy mã trong AppDomain thử nghiệm.
George Mauer

2
Đó là lẽ nhớ. Tôi không chắc tôi theo bạn khi bạn nói "chạy mã trong AppDomain thử nghiệm.". Tôi đọc câu hỏi của bạn là muốn thực thi mã trước một loạt các thử nghiệm, nếu đó là một cái gì đó khác. "Tập lệnh thiết lập và tập lệnh dọn dẹp chạy trước và sau khi chạy thử nghiệm, bất kể loại thử nghiệm có trong các lần chạy thử nghiệm đó." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024 Ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.