2013-07-22 2 views
3

У меня есть базовый класс, который имеет TestInitialize и TestCleanup. Затем у меня есть другие классы тестов, которые наследуются от этого класса. Предполагается, что TestCleanup выполняет определенные действия, когда тест из производного класса выходит из строя.Когда MSTest не работает в TestInitialize, почему TestCleanup не выполняется?

TestCleanup Выполняется, когда тест не проходит в реальном тесте. Однако, когда тест завершается с ошибкой в ​​TestInitialize, TestCleanup даже не выполняется. Почему это происходит и есть способ получить TestCleanup, чтобы получить вызов в любом случае?

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

+0

Можете ли вы подробнее объяснить, почему вы получаете исключения в своем TestInitialize? Это не то, что я обычно ожидаю. –

ответ

6

Это известная проблема. Похоже, что это было сообщено Microsoft connect.

http://connect.microsoft.com/VisualStudio/feedback/details/694337/testcleanup-method-does-not-run-when-it-should

+0

Спасибо. В качестве обходного пути я просто извлек код и поместил его другим способом. Теперь я проверяю, не завершится ли мое утверждение, и если я позвоню этому методу, а затем вызову assert.fail(). – jgerstle

2

В моем мнении вы не должны писать код в TestInitialize, который может выйти из строя.

Если вы считаете, что делаете правильно, и вы просто хотите поймать его, если он не удается, почему бы не обернуть TestInitialize с помощью try-catch и вызвать ваш код или TestCleanup для исключения?

+0

Это тесты с кодировкой-ui. В моем TestInitialize я пытаюсь открыть приложение и утверждать, что приложение действительно открыто. Это, на мой взгляд, имеет смысл, потому что я должен напомнить этот код в каждом тесте. Мой TestCleanup пытается убить приложение, что необходимо, если приложение находится в плохом состоянии – jgerstle

+0

@ilhbh, может быть, немного поздно, но 'TestInitialize' действительно вызывается с каждым тестом. Если вы хотите вызвать его только один раз, вам нужно использовать 'ClassInitialize'. –

0

У нас есть попробовать поймать в нашем TestInitialize. Его для кодированных тестов пользовательского интерфейса, и если вы не уничтожите приложение/браузер, у вас будет открыто несколько окон при следующем подключении к тестовой среде (если вы развертываете и тестируете на одном из них).

Есть много вещей, которые могут ошибаться в testinitialize при разговоре о CodedUI, поэтому используйте TryCatch и вызовите TestCleanup вручную в Catch. Более правильным является то, что в Catch мы убиваем приложение/браузер так же, как и TestCleanup. Мы не вызываем функцию очистки. Но если сможешь, то сделай так.

Смежные вопросы