Какой лучший способ избежать попытки ... поймать ... наконец ... в моих модульных тестах? - PullRequest
5 голосов
/ 24 ноября 2011

Я пишу много модульных тестов в VS 2010 с Microsoft Test. В каждом тестовом классе у меня есть много методов тестирования, подобных приведенным ниже:

[TestMethod]
public void This_is_a_Test()
{
  try
  {
    // do some test here
    // assert
  }
  catch (Exception ex)
  {
    // test failed, log error message in my log file and make the test fail
  }
  finally
  {
    // do some cleanup with different parameters
  }
}

Когда каждый метод испытаний выглядит так, я чувствую себя ужасно. Но до сих пор я не нашел хорошего решения, чтобы сделать мой тестовый код более чистым, особенно код очистки в блоке finally. Может ли кто-нибудь здесь дать мне несколько советов по этому поводу?

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 24 ноября 2011

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

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

Assert.Throws<ExceptionType>(() => { ... code block... });
Assert.DoesNotThrow(() => { ... code block... });

Идля очистки специальных атрибутов метода, таких как [TestCleanup] и [TestInitialize], для автоматической инициализации и очистки теста с помощью инфраструктуры тестирования.

[*] Идея состоит в том, чтобы обернуть тело теста вделегировать и передать помощнику, который фактически выполняет выполнение теста, заключенный в блок try / catch:

// helper
public void ExecuteTest(Action test)
{
  try
  {
     test.Invoke();
  }
  catch (Exception ex)
  {
    // test failed, log error message in my log file and make the test fail
  }
  finally
  {
    // do some cleanup with different parameters
  }
}

[TestMethod]
public void This_is_a_Test_1()
{
   Action test = () =>
   {
       // test case logic
       // asserts
   };

   this.ExecuteTest(test);
}
1 голос
/ 24 ноября 2011

Очистите все try-catch-finally (особенно catch не только не нужно, но даже вредно, вы не должны ловить исключение при тестировании) и выполните очистку в методе tearDown (однако это делается в MS Test, я бы предположил, что там будет что-то вроде [TearDownMethod] или [FixtureTearDown] или что-то подобное).

0 голосов
/ 24 ноября 2011

Рассматривали ли вы использование атрибута ExpectedException в методе тестирования?http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.expectedexceptionattribute.aspx

...