2012-05-23 26 views
6

Tôi có một thư viện lớp nunit chứa các trường hợp thử nghiệm. Tôi muốn lập trình danh sách tất cả các bài kiểm tra trong thư viện, chủ yếu là tên bài kiểm tra và id kiểm tra của họ. Dưới đây là những gì tôi có cho đến thời điểm này:Lấy danh sách các bài kiểm tra trong thư viện nunit theo lập trình mà không phải chạy thử nghiệm

var runner = new NUnit.Core.RemoteTestRunner(); 
runner.Load(new NUnit.Core.TestPackage(Request.PhysicalApplicationPath + "bin\\SystemTest.dll")); 
var tests = new List<NUnit.Core.TestResult>(); 
foreach (NUnit.Core.TestResult result in runner.TestResult.Results) 
{ 
    tests.Add(result); 
} 

Vấn đề là runner.TestResult là null cho đến khi bạn thực sự chạy thử nghiệm. Tôi rõ ràng không muốn chạy các bài kiểm tra vào thời điểm này, tôi chỉ muốn có được một danh sách các bài kiểm tra nào có trong thư viện. Sau đó, tôi sẽ cung cấp cho người dùng khả năng chọn một bài kiểm tra và chạy nó một cách riêng lẻ, chuyển qua id kiểm tra đến cá thể RemoteTestRunner.

Vậy làm cách nào để có danh sách các bài kiểm tra mà không thực sự chạy tất cả các bài kiểm tra?

Trả lời

6

Bạn có thể sử dụng phản chiếu để tải cụm và tìm kiếm tất cả thuộc tính test. Điều này sẽ cung cấp cho bạn tất cả các phương pháp được thử nghiệm phương pháp. Phần còn lại là tùy thuộc vào bạn.

Dưới đây là ví dụ về msdn về cách sử dụng phản chiếu để nhận các thuộc tính cho một loại. http://msdn.microsoft.com/en-us/library/z919e8tw.aspx

+1

+1, tuy nhiên có một twist: với TestCaseAttribute bạn có thể parametrize một phương pháp kiểm tra, do đó biến nó thành nhiều bài kiểm tra (logic). Không có gì mà không thể được xử lý bằng sự phản chiếu, nhưng một cái gì đó để ghi nhớ. –

+0

@ Christian.K Điểm tốt, cho OP để ghi nhớ. –

+0

Tôi đã suy nghĩ về việc này ban đầu, vì nó sẽ cho tôi tên thử nghiệm (chức năng), tuy nhiên nó sẽ không cho tôi các id kiểm tra. Miễn là tôi có thể thực hiện một cuộc chạy RemoteTestRunner được lọc bằng tên kiểm tra thay vì id kiểm tra thì điều này sẽ hoạt động tốt, sẽ kiểm tra nó. – Justin

4

Đây là đoạn mã để lấy tất cả các tên kiểm tra ra khỏi kiểm tra Class Library Assembly:

//load assembly. 
      var assembly = Assembly.LoadFile(Request.PhysicalApplicationPath + "bin\\SystemTest.dll"); 
      //get testfixture classes in assembly. 
      var testTypes = from t in assembly.GetTypes() 
       let attributes = t.GetCustomAttributes(typeof(NUnit.Framework.TestFixtureAttribute), true) 
       where attributes != null && attributes.Length > 0 
       orderby t.Name 
        select t; 
      foreach (var type in testTypes) 
      { 
       //get test method in class. 
       var testMethods = from m in type.GetMethods() 
            let attributes = m.GetCustomAttributes(typeof(NUnit.Framework.TestAttribute), true) 
        where attributes != null && attributes.Length > 0 
        orderby m.Name 
        select m; 
       foreach (var method in testMethods) 
       { 
        tests.Add(method.Name); 
       } 
      } 
1

Câu trả lời bởi Justin không làm việc cho tôi. Sau đây không (lấy tất cả các tên phương pháp với một thuộc tính Test):

Assembly assembly = Assembly.LoadFrom("pathToDLL"); 
foreach (Type type in assembly.GetTypes()) 
{ 
    foreach (MethodInfo methodInfo in type.GetMethods()) 
    { 
     var attributes = methodInfo.GetCustomAttributes(true); 
     foreach (var attr in attributes) 
     { 
      if (attr.ToString() == "NUnit.Framework.TestAttribute") 
      { 
       var methodName = methodInfo.Name; 
       // Do stuff. 
      } 
     } 
    } 
} 
+0

Tác phẩm này. Nếu bạn muốn để có được số lượng các bài kiểm tra trong hiện tại của bạn đang chạy testclass isstead của toàn bộ dll thêm mã sau đây: if (TestContext.CurrentContext.Test.ClassName.Contains (type.Name)) {... –

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