Как я могу остановить закодированный тест пользовательского интерфейса, управляемый данными

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

Спасибо


person AndySousa    schedule 17.09.2013    source источник
comment
Это помогло бы опубликовать код...   -  person Austin Salonen    schedule 17.09.2013
comment
на самом деле не так много кода для публикации. Это просто тест codedui, который вытягивает итерации из MTM. Assert завершит эту итерацию, просто не знал, есть ли способ остановить итерацию.   -  person AndySousa    schedule 17.09.2013


Ответы (2)


У меня была аналогичная проблема, и после некоторых исследований я обнаружил, что есть два возможных решения: 1. Сложное — создать свой собственный диспетчер тестов с собственным адаптером данных, внедрив ITestMethodInvoker интерфейс. Там вы можете запустить тестовую итерацию так, как хотите. Вам также потребуется переопределить класс TestContex, чтобы передать в метод тестирования строки данных из адаптера данных. 2. Самый простой. Это фактически не остановит Visual Studio от перебора всех DataRows в вашем источнике данных, но вместо выполнения фактического метода тестирования Visual Studio пометит его как пропущенный и продолжит. Вот пример кода:

[CodedUITest]
public class MyTestClass
{
    private TestContext testContext;
    private static int countFailedIterations = 0;
    private static string currentMethod = "";

    public MyTestClass()
    {
        if (!currentMethod.Equals(testContext.FullyQualifiedTestClassName))
        {
            // Reset Iteration Count
            countFailedIterations = 0;
            currentMethod = testContext.FullyQualifiedTestClassName;
        }
    }

    [TestInitialize]
    public void MyTestInit()
    {
        if (countFailedIterations > 0)
            Assert.Inconclusive("Stop it, please");
    }

    [TestCleanup]
    public void MytestCleanup()
    {
        if (testContext.CurrentTestOutcome != UnitTestOutcome.Passed)
            countFailedIterations++;
    }

    [TestMethod]
    [DataSource("MyDataSource")]
    public void MyTestMethod()
    {
        //Blah Blah Blah
    }

    public TestContext TestContext
    {
        get { return testContext; }
        set { testContext = value; }
    }
}
person Igor    schedule 18.09.2013
comment
большое спасибо за это ... это именно то, что я искал. Я только что попробовал это, и кажется, что мой TestContext становится нулевым, как только он попадает в конструктор, поэтому он никогда не переходит в TestMethod. Я что-то пропустил? - person AndySousa; 18.09.2013
comment
просто удаление конструктора действительно сработало... странно. О, это то, что мне было нужно. Спасибо еще раз - person AndySousa; 18.09.2013

Код внутри конструктора требуется только в том случае, если у вас есть несколько методов тестирования, управляемых данными, поэтому вы хотите сбросить счетчик неудачных итераций. Но вы правы - когда конструктор запускается, TestContext все еще не инициализирован. Вы действительно можете переместить код из конструктора в метод MyTestInit() - он должен работать.

person Igor    schedule 18.09.2013