У меня есть тест CodedUI. Это спорадический сбой по исключению (не может сфокусировать элемент). Могу ли я сделать что-то подобное
[TestMethod]
public void MySporadicFailedTest()
{
try {
//Some Test action
}
catch((Exception ex)) {
if (ex is System.Exception.ElementNotFocused){
//retry test
}
}
}
С этим я часто сталкиваюсь при написании тестов кодированного интерфейса. Я почти всегда заканчиваю тем, что пишу простой метод расширения для обработки повторных действий (не весь тест!). Иногда, особенно на страницах со странной, нестандартной разметкой или множеством событий AJAXy, вы просто попадаете в ситуацию, когда действие не срабатывает через одну секунду, потому что что-то еще не готово, а затем передать следующее.
public static class TestRetryExtensions
{
public static void WithRetry<T>(this Action thingToTry, int timeout = 30) where T: Exception
{
var expiration = DateTime.Now.AddSeconds(timeout)
while (true)
{
try
{
thingToTry();
return;
}
catch (T)
{
if (DateTime.Now > expiration)
{
throw;
}
Thread.Sleep(1000);
}
}
}
}
Затем, в рамках моего фактического теста:
uiMap.ClickSomeThing();
uiMap.EnterSomeText();
Action clickSomeOtherThingAction = () => uiMap.ClickSomeOtherThingThatFailsForNoReason();
clickSomeOtherThingAction.WithRetry<UITestControlHiddenException>(60);
Он пытается выполнить действие. Если это не удается, за исключением того, что вы не знаете, что это случайная "нормальная" вещь, она выдает исключение как обычно. Если это не удается, за исключением того, что вы говорите ему, чтобы повторить попытку, он будет продолжать попытки этого действия (с задержкой 1 секунда между попытками) до тех пор, пока тайм-аут не будет превышен, и в этот момент он просто отбрасывает и отменяет исключение.
we can include below line of code in test clean up method to re run the failed script
if (TestContext.CurrentTestOutCome==TestContext.unittestoutcome.failed)
{
var type=Type.GetType(TestContext.FullyQualifiedTestClassName);
if (type !=null)
{
var method=Type.GetMethod(TestContext.TestName);
var event=Activator.CreateInstance(type);
}
method.invoke(event);
}
Если тест codedUI постоянно терпит неудачу без надлежащей причины, вы можете добавить код для повышения эффективности теста и сделать его безопасным. Если тест с ошибкой, особенно при фокусировке на элемент, сначала попытайтесь сфокусироваться на элементе верхнего уровня, а затем попробуйте сосредоточить дочерние элементы. Эта LINK может помочь вам написать тесты с отказоустойчивым тестированием.
Пока вы можете поймать, какое когда-либо исключение бросается, вы можете обернуть свой тестовый код в цикл повтора. Затем он будет проверять тестовый код определенное количество раз, прежде чем сдаться:
for (var i = 0; i < TimesToRetry; i++)
{
try{
//perform test
//test ran correctly - break out loop to end test
break;
}
catch(Exception){
//might want to log exception
}
}