2012-08-01 10 views
10

przechowywać różne informacje na temat danego testu (identyfikatory dla wielu bugtracker) w atrybut tak:Jak uzyskać atrybuty metody testu jednostkowego w środowisku wykonawczym z testu NUnit?

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

W celu pobrania tej informacji w trakcie testu, napisałem poniższy kod:

 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; 
       } 
      } 
     } 

problem polega na tym, że podczas uruchamiania testów poprzez NUnit w trybie Release, metoda, która powinna mieć nazwę testu i te atrybuty otrzymuje brzmienie:

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) 

UPDATE Dla każdego, kto jest zainteresowany, ja likwidacji implementacji kodu w następujący sposób (tak, że każda z wartości atrybutów można uzyskać dostępu, bez zmiany istniejącego kodu, który używa atrybutu TestCaseVersion:

[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

Niezła aktualizacja !!! Chciałbym dać ci drugi awans, gdybym mógł :-) –

Odpowiedz

8

Jeśli jesteś OK z posiadania jednego wycenione testowej wersji przypadek ciąg (tj "001, B-8345, X543" zamiast "001","B-8345","X543"), powinieneś być w stanie korzystać z funkcjonalności dostępnych w TestContext NUnit 2.5.7 i wyższe .

Konkretnie, można zdefiniować i wykorzystać kontekst testową Property atrybutu TestCaseVersion tak:

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

UPDATE BTW Jeśli zrobić chcesz użyć multi-wyceniane reprezentację testu wersja obudowy, możesz zdefiniować wiele właściwości, takich jak to:

[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

Dzięki, to jedyne rozwiązanie, jakie mogłem znaleźć. Szkoda, że ​​nie było sposobu na uzyskanie jakichkolwiek innych atrybutów rzeczywistej metody testowania, ale to będzie musiało zrobić – breed052

0

Może nie rozumiem twojego pomysłu, ale dlaczego nie zastosować prostszego rozwiązania?

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

Jestem zadowolony z TestName w NUnit TestContext, ale chcę dostarczyć wiele dodatkowych wartości po prostu dodając je do atrybutu. Jeśli użyję ich w atrybucie TestCase, będę musiał dodać je jako parametry do metody testowania, a nadal nie będą dostępne bez dodawania dodatkowego kodu do każdego testu. – breed052

+0

Ale w jaki sposób zamierzasz użyć 'GetTestID()', dodać dodatkowe informacje do potwierdzenia wiadomości? – Akim

+0

Używam GetTestID na metodę, którą wszystkie testy wywołują, aby zarejestrować wyniki testów. – breed052

Powiązane problemy