2016-03-31 2 views
2

У меня есть следующие настройки для запуска моих тестов параллельно (для Selenium тестов):Как добавить не-тест-метод в качестве теста во время выполнения теста в MSTest?

[TestClass] 
public class ParallelTests 
{ 
    [TestMethod] 
    public void TestAllParallel() 
    { 
     var testActions = Assembly.GetExecutingAssembly().GetTypes() 
      .Where(t => 
       t.GetCustomAttribute<CompilerGeneratedAttribute>() == null && 
       t.GetCustomAttribute<TestClassAttribute>() != null) 
      .Select(t => new Action(() => RunTest(t))) 
      .ToArray(); 

     System.Threading.Tasks.Parallel.Invoke(testActions); 
    } 

    private static void RunTest(Type test) 
    { 
     var instance = Activator.CreateInstance(test); 

     ExecuteTestMethods(instance); 
    } 

    private static void ExecuteTestMethods(object instance) 
    { 
     var testMethods = instance.GetType().GetMethods() 
      .Where(m => 
       m.GetCustomAttribute<TestMethodAttribute>(false) != null && 
       m.GetCustomAttribute<IgnoreAttribute>(false) == null) 
      .ToArray(); 

     foreach (var methodInfo in testMethods) 
     { 
      methodInfo.Invoke(instance, null);; 
     } 
    } 
} 

Это прекрасно работает, хотя результат протокол испытаний на моем сервере Дженкинс только показывает, что один тест запуска. Я хотел бы видеть в отчете все тесты, которые были выполнены TestAllParallel().

Это можно сделать? Я думаю, что, возможно, можно было бы добавить метод в качестве теста для MSTest во время выполнения.

+0

Я не думаю, что у mstest есть метод для добавления тестов во время выполнения. Вы могли бы создать отдельный файл trx для своих тестов (генерируя файл в ваших методах), а затем плагин mstest в Jenkins подумает, что он был выведен из MSTest. –

+0

Возможно, вы можете попытаться проверить покрытие кода для самого тестового кода (вместо проверяемого кода). Хотя я не уверен, как это сделать в jenkins & mstest. –

+0

Почему вы выполняете все свои тесты самостоятельно и не поручаете вашему серверу Jenkins сделать это за вас? – silver

ответ

1

Я боюсь, что невозможно добавить метод, но вы можете сообщить о результатах всех прогонов в этом конкретном тесте. Первое исполнение обертка методов испытаний с чем-то похож на код ниже, так что вы можете сохранить результаты прогонов:

private static void ExecuteMethod(MethodInfo method, object instance) 
    { 
     try 
     { 
      method.Invoke(instance, null); 
      threadSafeStringBuilder.Append("Test: " + method.Name + " passed"); 
     } 
     catch (UnitTestAssertException utException) 
     { 
      threadSafeStringBuilder.Append("Test: " + method.Name + " assertion failed" + utException.Message); 
      _allPassed = false; 
     } 
     catch (Exception ex) 
     { 
      threadSafeStringBuilder.Append("Test: " + method.Name + " exception: " + ex.Message"); 
     } 

    } 

Позже в testAllParallel:

public void TestAllParallel() 
{ 
//... 
System.Threading.Tasks.Parallel.Invoke(testActions); 
if(_allPassed){ 
    Assert.IsTrue(true, "All tests Passed:\n"+threadSafeStringBuilder.ToString()); 
    }else{ 
    Assert.Fail("Some tests failed:\n"+threadSafeStringBuilder.ToString()); 
    } 

) 

Пожалуйста, имейте в виду, что это просто идея, а не полностью рабочий код. В частности, нет ThreadSafeStringBuilder в .net, поэтому, вероятно, вам нужно реализовать свою собственную или использовать некоторую библиотеку.

+0

Это позволит собрать несколько сбоев в журнале ошибок и является улучшением моей настройки, хотя это не касается моего вопроса. Но ты получаешь щедрость! – Drutten

0

Существует еще одна система, которая может работать так же хорошо, используя System.Diagnostics.WriteLine. Он выводит все, что вы пишете в нем. Вот еще один вопрос, обсуждающий это: Add custom message to unit test result

Очень интересный момент в этой теме: без сообщения о статусе кто-то может «саботировать» ваши тесты, удалив все тестовое содержимое, чтобы оно прошло, поэтому вам может понадобиться все равно отправьте диагностику в нормальные тесты.

+0

Боюсь, что писать на консоль не добавит тест в список результатов в Дженкинсе. – Drutten

0

Я не уверен, что правильно понял ваш вопрос, но я думаю, что вы должны немного изменить свое решение, чтобы преодолеть эту неудачу. Попробуйте построить в Jenkins проект, который выполняет только командную строку, команда может выполнять все ваши тесты с помощью команды MSTest. вы можете увидеть, как это сделать here