Как сохранить результат теста в переменную, независимо от того, передана она или нет после выполнения теста? - PullRequest
3 голосов
/ 20 марта 2020

Я использую Selen Webdriver в Visual Studio Using NUNIT C#. Код контрольного примера:

public class MainProjectFile
{
    private IWebDriver WDriver;
    private log4net.ILog Testlog;


    [TestInitialize]
    public void wd()
    {
        WDriver = Helper.GetWebDriver(helperconst.browserType.Chrome);
        Testlog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    }
    [Priority(1)]
    [TestMethod]
    public void search()
    {
        Testlog.Info("Test ID:001, This test will select the criteria and update the customer dropdown");

        Testlog.Info("Step 1/1 : Select customer from cutomer dropdown");
        var dc = gmethods.GetSelectElement(WDriver, dpo.customermenu);
        dc.SelectByText(dpc.customer);
    }
    [TestCleanup]
    public void CleanUp()
    {
        WDriver.Close();
        WDriver.Quit();
    }
}

На странице dpo:

public static class dpo
{
    public const string customermenu = "[data]";
}

На странице dp c Страница

public static class dpc
{
    public const string customer = "A";
}

На странице метода:

static public SelectElement GetSelectElement(IWebDriver drv, string elem)
{
    SelectElement a = new SelectElement(drv.FindElement(By.CssSelector(elem)));
    return a;
}

Я хочу записать, что тестовый пример пройден или не пройден в переменной сразу после выполнения тестового примера. Как мне этого добиться?

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

NUnit

Предположим, что вы используете NUnit (потому что то, что в вопросе выглядит как MSTest), вы можете написать собственный атрибут IWrapTestMethod для расширения команды теста. Атрибут дает вам возможность проверять результаты теста до и после каждого запуска теста:

// I don't know where your variable is, so just use this dummy class with
// some dummy static properties.
class TestResultKeeper
{
    public static TestResult TestResult { get; set; }
    public static ResultState ResultState => TestResult?.ResultState ?? ResultState.Failure;
    public static bool IsPassed => ResultState == ResultState.Success;
    public static Exception Exception { get; set; }
}

// Custom NUnit 3 attribute to extend test method
public class LogTestAttribute : Attribute, IWrapTestMethod
{
    public TestCommand Wrap(TestCommand command)
    {
        // Wrap test command
        return new LogTestResultCommand(command);
    }
}

class LogTestResultCommand : DelegatingTestCommand
{
    public LogTestResultCommand(TestCommand innerCommand)
        : base(innerCommand)
    {

    }

    public override TestResult Execute(TestExecutionContext context)
    {
        try
        {
            var result = innerCommand.Execute(context);

            // Set test result to TestResultKeeper

            TestResultKeeper.TestResult = result;
            TestResultKeeper.Exception = null;

            return result;
        }
        catch (Exception e)
        {
            // Exception thrown from test. Test failed.

            TestResultKeeper.TestResult = null;
            TestResultKeeper.Exception = e.InnerException;
            throw;
        }
    }
}

Использование:

[Test, LogTest]
public void Test1()
{
    Assert.Fail();
}

[Test, LogTest]
public void Test2()
{
    Assert.Pass();
}

MSTest

Предположим, что ваш test написан на MSTest (в соответствии с вашим примером), вы можете создать новый атрибут метода теста и получить его из TestMethodAttribute, а также выполнить действия, описанные выше:

class TestResultKeeper
{
    public static TestResult TestResult { get; set; }
    public static UnitTestOutcome TestOutcome => TestResult?.Outcome ?? UnitTestOutcome.Failed;
    public static bool IsPassed => TestOutcome == UnitTestOutcome.Passed;
    public static Exception Exception { get; set; }
}

public class LogTestTestMethodAttribute : TestMethodAttribute
{
    public override TestResult[] Execute(ITestMethod testMethod)
    {
        var testResult = base.Execute(testMethod)[0];


        TestResultKeeper.TestResult = testResult;
        TestResultKeeper.Exception = testResult.TestFailureException;

        return new[] { testResult };
    }
}

Использование :

[LogTestTestMethod]
public void TestMethod1()
{
}
1 голос
/ 30 марта 2020

Для NUnit вы можете получить доступ к результату и другим деталям теста, используя свойства, найденные в TestContext.CurrentContext .

Для вашей проблемы вы можете добавить следующее отметьте в методе теста разрыв

if(TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Passed) { .... }

Изменить, чтобы включить MSTest :

Для MSTest добавьте следующее свойство в свой тестовый класс

public TestContext TestContext { get; set; }

Затем используйте его, добавив следующее к TestCleanup

if(TestContext.CurrentTestOutcome == UnitTestOutcome.Passed) { .... }
...