2012-08-01 31 views
10

tôi lưu trữ thông tin khác nhau về việc xét nghiệm nhất định (ID cho nhiều hệ thống theo dõi bug) trong một thuộc tính như vậy:Làm thế nào để có được các thuộc tính phương pháp thử nghiệm đơn vị khi chạy trong một thử nghiệm NUnit?

[TestCaseVersion("001","B-8345","X543")] 
public void TestSomethingOrOther() 

Để lấy thông tin này trong quá trình thử nghiệm, tôi đã viết đoạn code dưới đây:

 public string GetTestID() 
    { 
     StackTrace st = new StackTrace(1); 
     StackFrame sf; 
     for (int i = 1; i <= st.FrameCount; i++) 
     { 
      sf = st.GetFrame(i); 
      if (null == sf) continue; 
      MethodBase method = sf.GetMethod(); 
      if (method.GetCustomAttributes(typeof(TestAttribute), true).Length == 1) 
      { 
       if (method.GetCustomAttributes(typeof(TestCaseVersion), true).Length == 1) 
       { 
        TestCaseVersion tcv = 
         sf.GetMethod().GetCustomAttributes(typeof(TestCaseVersion), true).OfType<TestCaseVersion>() 
          .First(); 
        return tcv.TestID; 
       } 
      } 
     } 

vấn đề là khi chạy thử nghiệm qua NUnit trong chế độ phát hành, phương pháp mà nên có tên thử nghiệm và những thuộc tính này được thay thế bởi những điều sau đây:

System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
    at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at NUnit.Core.Reflect.InvokeMethod(MethodInfo method, Object fixture, Object[] args) 

CẬP NHẬT Đối với bất cứ ai quan tâm, tôi lên vết thương triển khai mã theo cách sau (vì vậy mà bất kỳ giá trị thuộc tính có thể được truy cập, mà không thay đổi bất kỳ mã hiện có sử dụng TestCaseVersion thuộc tính:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method, AllowMultiple = false)] 
public class TestCaseVersion : PropertyAttribute 
{ 
    public TestCaseVersion(string testCaseCode, string story, string task, string description) 
    { 
     base.Properties.Add("TestId", testCaseCode); 
     base.Properties.Add("Description", description); 
     base.Properties.Add("StoryId", story); 
     base.Properties.Add("TaskId", task); 
    } 
} 

public string GetTestID() 
{ 
    return TestContext.CurrentContext.Test.Properties["TestId"]; 
} 
+0

Cập nhật tốt đẹp !!! Tôi sẽ cung cấp cho bạn một upvote thứ hai nếu tôi có thể :-) –

Trả lời

8

Nếu bạn là OK với việc có một thử nghiệm phiên bản chữ chuỗi duy nhất có giá trị (ví dụ: "001, B-8345, X543" thay vì "001","B-8345","X543"), bạn sẽ có thể tận dụng các TestContext chức năng có sẵn trong NUnit 2.5.7 và cao hơn .

Cụ thể, bạn có thể xác định và sử dụng một bối cảnh thử nghiệm Property thuộc tính TestCaseVersion như thế này:

[Test, Property("TestCaseVersion", "001, B-8345, X543")] 
public void TestContextPropertyTest() 
{ 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["TestCaseVersion"]); 
} 

CẬP NHẬT BTW, Nếu bạn làm muốn sử dụng một đại diện đa giá trị của thử nghiệm phiên bản trường hợp, bạn có thể xác định nhiều thuộc tính, như sau:

[Test, Property("MajorVersion", "001"), 
Property("MinorVersion", "B-8345"), Property("Build", "X543")] 
public void TestContextPropertyTest() 
{ 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["MajorVersion"]); 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["MinorVersion"]); 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["Build"]); 
} 
+0

Cảm ơn, đó là giải pháp duy nhất tôi có thể tìm thấy là tốt. Tôi ước có một cách để có được bất kỳ thuộc tính nào khác của phương pháp thử nghiệm thực tế, nhưng điều này sẽ phải làm – breed052

0

Có thể tôi không hiểu ý tưởng của bạn, nhưng tại sao không sử dụng giải pháp đơn giản hơn nhiều?

[TestCase(TestName = "001, B-8345, X543")] 
public void TestSomethingOrOther() 
+0

Tôi hài lòng với TestName trong NUNit TestContext, nhưng tôi muốn cung cấp nhiều giá trị bổ sung chỉ đơn giản bằng cách thêm chúng vào thuộc tính. Nếu tôi sử dụng chúng trong một thuộc tính TestCase, tôi sẽ phải thêm chúng như là các tham số cho phương thức thử nghiệm, và chúng vẫn không thể truy cập được mà không cần thêm mã bổ sung vào mọi thử nghiệm. – breed052

+0

Nhưng làm thế nào bạn sẽ sử dụng 'GetTestID()', thêm thông tin bổ sung để xác nhận tin nhắn? – Akim

+0

Tôi sử dụng GetTestID trên một phương thức mà tất cả các cuộc kiểm tra gọi, để ghi lại kết quả của các bài kiểm tra. – breed052

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