2012-03-12 12 views
17

Cách lấy tên kiểm tra đơn vị từ thử nghiệm đơn vị bên trong?Làm cách nào để lấy tên phương thức thử nghiệm đơn vị khi chạy trong thử nghiệm đơn vị?

tôi có phương pháp dưới đây bên trong một lớp BaseTestFixture:

public string GetCallerMethodName() 
{ 
    var stackTrace = new StackTrace(); 
    StackFrame stackFrame = stackTrace.GetFrame(1); 
    MethodBase methodBase = stackFrame.GetMethod(); 
    return methodBase.Name; 
} 

My class Test Lịch thi đấu được thừa hưởng từ cơ sở một:

[TestFixture] 
public class WhenRegisteringUser : BaseTestFixture 
{ 
} 

và tôi có kiểm tra hệ thống dưới đây:

[Test] 
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully_WithValidUsersAndSites() 
{ 
    string testMethodName = this.GetCallerMethodName(); 
    // 
} 

Khi tôi chạy điều này từ bên trong Visual Studio, nó trả về tên phương thức thử nghiệm của tôi như mong đợi.

Khi điều này được điều hành bởi TeamCity, thay vào đó, _InvokeMethodFast() được trả về mà có vẻ là phương pháp mà TeamCity tạo ra khi chạy theo thời gian sử dụng riêng.

Vậy làm cách nào tôi có thể lấy tên phương thức thử nghiệm khi chạy?

+0

Được biên dịch ở chế độ phát hành ngay cả khi được khởi chạy từ VS phải không? –

+1

Bạn có nhận được thông tin lắp ráp cho mỗi phương pháp được gọi trong ngăn xếp không? Có lẽ bạn có thể đi lên ngăn xếp tìm kiếm lắp ráp thử nghiệm của bạn. –

+0

Một stacktrace sẽ giúp đỡ, để xem nếu tên phương pháp thực tế được liệt kê xa hơn ngăn xếp cuộc gọi. –

Trả lời

17

Nếu bạn đang sử dụng NUnit 2.5.7/2,6 bạn có thể sử dụng TestContext class:

[Test] 
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully() 
{ 
    string testMethodName = TestContext.CurrentContext.Test.Name; 
} 
+1

Tính năng đẹp :) –

+1

MSTest cũng cho thấy thông tin này trong TestContext của nó cũng như – bryanbcook

+0

Nó bây giờ chạy tốt từ TeamCity nhưng khi tôi chạy nó cục bộ từ trong Visual Studio, nó ném một ngoại lệ mà một đối tượng không được khởi tạo. Vậy làm thế nào để làm cho nó hoạt động từ bên trong Visual studio? –

7

Nếu bạn không sử dụng NUnit bạn có thể lặp qua ngăn xếp và tìm ra phương pháp kiểm tra:

foreach(var stackFrame in stackTrace.GetFrames()) { 
    MethodBase methodBase = stackFrame.GetMethod(); 
    Object[] attributes = methodBase.GetCustomAttributes(typeof(TestAttribute), false); 
    if (attributes.Length >= 1) { 
    return methodBase.Name; 
    } 
} 
return "Not called from a test method"; 
+0

Bạn có biết nếu điều này chỉ hoạt động trên MSTest? Hoặc nó sẽ làm việc trên cả NUnit và MSTest? – Yoiku

+0

Bạn sẽ cần thay đổi chú thích thành chú thích phù hợp cho khung kiểm tra. Tuy nhiên như câu trả lời được chấp nhận chỉ ra, NUnit có một TestContext đó là một giải pháp tốt hơn. –

+0

Cảm ơn câu trả lời, tôi đã hỏi vì tôi đang cố gắng xây dựng một FW và tôi không muốn hạn chế bản thân mình với NUnit hoặc MSTest. Vì vậy, tôi nghĩ rằng những gì tôi sẽ làm là để lặp chồng từ dưới lên trên cho đến khi tôi tìm thấy một phương pháp mà nó không gian tên không phải là từ Microsoft hoặc hệ thống. Tôi đã thử điều này và tôi đã có kết quả tốt với MSTest và gọi FW từ một chương trình dòng lệnh (tôi đã nhận được phương pháp chính). – Yoiku

5

Xin cảm ơn các bạn; Tôi đã sử dụng phương pháp kết hợp để nó hiện hoạt động trong mọi môi trường:

public string GetTestMethodName() 
{ 
    try 
    { 
     // for when it runs via TeamCity 
     return TestContext.CurrentContext.Test.Name; 
    } 
    catch 
    { 
     // for when it runs via Visual Studio locally 
     var stackTrace = new StackTrace(); 
     foreach (var stackFrame in stackTrace.GetFrames()) 
     { 
      MethodBase methodBase = stackFrame.GetMethod(); 
      Object[] attributes = methodBase.GetCustomAttributes(
             typeof(TestAttribute), false); 
      if (attributes.Length >= 1) 
      { 
       return methodBase.Name; 
      } 
     } 
     return "Not called from a test method"; 
    } 
} 
+0

xin lưu ý rằng trong bản dựng này đôi khi không hoạt động - phương pháp thử nghiệm có thể được gạch chân và bạn sẽ không thể xem TestAttribute – imaximchuk

0

Nếu bạn không sử dụng Nunit hoặc bất kỳ công cụ nào khác của bên thứ ba. bạn sẽ không nhận được TestAttribute.

Vì vậy, bạn có thể thực hiện việc này để lấy tên Phương thức thử nghiệm. Sử dụng TestMethodAttribute insted của TestAttribute.

public string GetTestMethodName() 
    { 
      // for when it runs via Visual Studio locally 
      var stackTrace = new StackTrace(); 
      foreach (var stackFrame in stackTrace.GetFrames()) 
      { 
       MethodBase methodBase = stackFrame.GetMethod(); 
       Object[] attributes = methodBase.GetCustomAttributes(typeof(TestMethodAttribute), false); 
       if (attributes.Length >= 1) 
       { 
        return methodBase.Name; 
       } 
      } 
      return "Not called from a test method"; 
    } 
11

Khi sử dụng Visual Studio để chạy thử nghiệm nếu bạn thêm TestContext property vào lớp kiểm tra, bạn có thể nhận thông tin này dễ dàng.

[TestClass] 
public class MyTestClass 
{ 
    public TestContext TestContext { get; set; } 

    [TestInitialize] 
    public void setup() 
    { 
     logger.Info(" SETUP " + TestContext.TestName); 
     // .... // 
    } 
}