2009-07-27 1 views
2

В моей компании мы пишем кучу модульных тестов. То, что мы хотели бы сделать, - это выполнить единичные тесты, и всякий раз, когда кто-то преуспевает или терпит неудачу в конце теста, мы можем записать это где-то, но мы не хотим ставить эту логику в каждом тесте.Как написать единичные тесты NUnit без необходимости их окружения с помощью утверждений try catch?

Любая идея, как мы могли просто написать тесты, не окружая содержание теста логикой try catch, которую мы использовали?

ответ

2

MSTest имеет TestCleanup, который запускается после каждого теста. В NUnit атрибутом, который будет использоваться, является TearDown (после каждого теста) или TestFixtureTearDown (после всего теста полностью). Это выполняется после окончания каждого теста.

Если вы хотите, чтобы что-то запускалось на всякий случай, если тест прошел, вы могли бы иметь переменную-член shouldRunExtraMethod, которая была инициализирована ложью перед каждым тестом и в конце теста была изменена на true. И на TearDown вы выполняете его только в зависимости от этого значения переменной

0

Операторы утверждения NUnit имеют возможность распечатывать сообщение для каждого теста, когда он терпит неудачу.

Хотя, если вы хотите, чтобы он выписывал что-то где-то в конце каждого теста, вы можете настроить его при разрыве каждого метода. Просто установите строку на то, что вы хотите записать внутри самого теста, и во время разрыва (что происходит после каждого теста). Он может делать все, что вам нужно.

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

2

Я не совсем уверен, что вы пытаетесь сделать здесь. Вы говорите, что обертываете его в try/catch, чтобы вы могли поймать, когда возникает исключение, и зарегистрировать это? Если да, то лучшим способом, вероятно, является просто заставить NUnit написать выходной файл и использовать его. Я не использовал NUnit около года, но IIRC вы можете перенаправить свой вывод в любой файл, который вам нравится, используя директиву/out.

Если у вас есть , у вас есть, чтобы зарегистрировать его так, как вы говорите, тогда вам придется либо добавить свой собственный код к каждому тесту, либо иметь общий «бегун», который принимает ваш код (для каждый тест) как анонимный метод и запускает его внутри одного файла try..catch. Это помешает вам повторить попытку. Для каждого теста.

Извините, если я неправильно понял вопрос.

3

Я предполагаю, что вы делаете что-то вроде этого:

[Test] 
public void FailBecauseOfException() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    catch (Exception e) 
    { 
     Assert.Fail(e.Message); 
    } 
} 

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

[Test] 
public void FailBecauseOfException() 
{ 
    throw new Exception(); 
} 
1

Если ваш метод модульного тестирования охватывает сценарий, в котором вы ожидаете исключения быть выброшены, используйте атрибут ExpectedException. Здесь есть сообщение о том, как использовать этот атрибут.

Expect exceptions in nUnit...

0

Проблема у вас есть то, что NUnit Утверждай * методы выбросит AssertionException всякий раз, когда утверждают не удается. - но ничего не делает. Таким образом, не похоже, что вы можете проверить что-либо за пределами модульного теста, чтобы проверить, не прошел тест или нет.

Единственная альтернатива, которую я могу придумать, - использовать AOP (Aspect Oriented Programming) с помощью такого инструмента, как PostSharp. Этот инструмент позволяет создавать аспекты, которые могут воздействовать на определенные события. Например:

public class ExceptionDialogAttribute : OnExceptionAspect 
{ 
    public override void OnException(MethodExecutionEventArgs eventArgs) 
    { 
    string message = eventArgs.Exception.Message; 
    Window window = Window.GetWindow((DependencyObject) eventArgs.Instance); 
    MessageBox.Show(window, message, "Exception"); 
    eventArgs.FlowBehavior = FlowBehavior.Continue; 
    } 
} 

Этот аспект является код, который выполняется всякий раз, когда возникает исключение:

[ExceptionDialog] 
[Test] 
public void Test() 
{ 
    assert.AreEqual(2, 4); 
} 

Поскольку выше тест сгенерирует исключение, код в ExceptionDialogAttribute будет работать. Вы можете получить информацию о методе, например, его имя, чтобы вы могли записать его в файл.

Прошло много времени с тех пор, как я использовал PostSharp, поэтому стоит проверить примеры и поэкспериментировать с ним.