C#NUnit的硒 - 传递对象从设置到测试用例(C# NUnit Selenium - Passi

2019-09-29 08:04发布

我不理解的作用域是如何工作的一个测试用例。

[TestFixture]
class MockTests
{
    [Setup]
    private void StartTest()
    {
        IWebDriver driver = new ChromeDriver();
        TestLogger logger = new TestLogger();
    }

    [TestCase(TestName = "mock1")]
    {
        //Problem is here. Driver and logger "does not exist in the current context"
        driver.Navigate().GoToUrl("http://my.url.com");
        logger.Out("Hello! I cannot be accessed!");
    }

    [TestCase(TestName = "mock2")]
    {
        //I now have a new instance of driver and logger in my mock2 test
        driver.Navigate().GoToUrl("http://my.url.com");
        logger.Out("Hello! I am a new Instance of TestLogger!");
    }

    [TearDown]
    private void EndTest()
    {
        driver.Quit();
        logger.PrintReport(TestContext.name, TestContext.status);
    }
}

在我看来,该设置是没有意义的,如果你不能用它来在整个测试访问对象的唯一实例。 我看到以类似的方式使用的VARS /对象,但在类别的范围所限定的VARS /对象; 即:私人IWebDriver驱动程序;

所以,如果我有一个单一的测试夹具内25个测试和并行运行它们; 测试功能可以聊到错误的驱动程序,而不是每一个TestCase的内部创造独特的实例。

如何做到这一点,所以我知道我的TestLogger和司机确实是独一无二的? 我如何通过他们设置测试和拆除之间?

而TestLogger仅仅是一个例子。 它可以像一个User对象模型什么:

public class User
{
    public string fName{get; set;}
    public string lName{get; set;}
    //etc...
}

也许我只是我不明白这个测试应该如何进行设置。

Answer 1:

变量driverlogger是您的本地设置方法。 他们走出去的范围时,方法退出。

如果你希望你的测试能够访问任何设置的情况,设置方法,那么它必须被保存在一个成员变量。

您的“测试案例”不是编译。 他们不是方法。 他们似乎没有做任何使用您传递的参数:“mock1”和“mock2”。 最有可能的,你想用户[Test]而不是[TestCases]

我已经看到了网络测试的大多数例子创建驱动程序仅每一次测试夹具,使用[OneTimeSetUp]而不是[设置]。 你真的想改变为每个测试的驱动程序? 如果是这样,如果你使用一个成员变量,那么你就不能并行运行测试用例,因为它们会互相干扰。 幸运的是,许多试验基地,并行运行的灯具给予足够好的性能。

更新:按照你的评论,很明显你想对每个测试情况下,单独的驱动程序。 你有两个选择...

  1. 不要并行运行测试用例。 使用[Parallelizable]在夹具上,使其与其他固定装置并行运行,但与它的串行运行测试用例,因为你没有Children的范畴。 如果你有一大堆其他附着物,使用它可以并行运行的,我想你会发现这是非常有效的。

  2. 并行运行的情况下,但不使用安装程序的方法来创建一个驱动程序。 相反,在每个测试创建它。 如果超过一行多,使用一种方法来恢复它。 您的每个测试用例都会有一个单独的驱动程序并消除踩着彼此测试的机会。

FWIW,这个例子是导致我想再看一下如何为并行测试夹具更好的分离而无需重写整个框架。



Answer 2:

查理说,他们必须是一个固定装置(类)内的成员变量范围遍及各种测试。

我的误解在想建立和拆除是相同的范围作为测试用例中。 我曾在我的头上,这是NUnit的是如何工作的?

这绝对不是这样的。 (没有双关语意,公顷)

因此,这里是表明,在并行地在所有测试工作的唯一实例工作的解决方案:

[TestFixture]
class MockTests
{
    IWebDriver driver;
    TestLogger logger;

    [Setup]
    private void StartTest()
    {
       //This instantiates a new driver and logger each test 
       driver = new ChromeDriver();
       logger = new TestLogger();
    }

    [TestCase(TestName = "mock1")]
    {
        Console.WriteLine("Driver: " + driver.CurrentWindowHandle);
        logger.Out("Hello! I am unique now! 1");
    }

    [TestCase(TestName = "mock2")]
    {
        Console.WriteLine("Driver: " + driver.CurrentWindowHandle);
        logger.Out("Hello! I am unique now! 2");
    }

    [TestCase(TestName = "mock3")]
    {
        Console.WriteLine("Driver: " + driver.CurrentWindowHandle);
        logger.Out("Hello! I am unique now! 3");
    }

    [TearDown]
    private void EndTest()
    {
        driver.Quit();
        logger.PrintReport(TestContext.CurrentContext.Test.Name, TestContext.CurrentContext.Result.Outcome.ToString());
    }
}


文章来源: C# NUnit Selenium - Passing Objects from SetUp to TestCase