【问题标题】:C# NUnit Selenium - Passing Objects from SetUp to TestCaseC# NUnit Selenium - 将对象从 SetUp 传递到 TestCase
【发布时间】:2017-10-14 18:31:20
【问题描述】:

我不了解范围界定如何在测试用例中发挥作用。

[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);
    }
}

在我看来,如果您不能使用 SetUp 在测试中访问唯一的对象实例,那么 SetUp 是毫无意义的。我看到变量/对象以类似的方式使用,但变量/对象定义在类的范围内;即:私有 IWebDriver 驱动程序;

所以,如果我在一个测试夹具中有 25 个测试并并行运行它们;测试函数可能与错误的驱动程序对话,而不是在每个 TestCase 中创建唯一的实例。

我该如何做才能知道我的 TestLogger 和驱动程序确实是独一无二的?如何在 SetUp 测试和 TearDown 之间传递它们?

TestLogger 只是一个例子。它可以是用户对象模型之类的任何东西:

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

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

【问题讨论】:

    标签: c# visual-studio selenium automated-tests nunit


    【解决方案1】:

    变量driverlogger 是您的设置方法的本地变量。当方法退出时,它们会超出范围。

    如果您希望您的测试能够访问 setup 方法中的任何设置,则必须将其保存在成员变量中。

    您的“测试用例”不可编译。它们不是方法。他们似乎没有使用您传递的参数:“mock1”和“mock2”。最有可能的是,您希望使用 [Test] 而不是 [TestCases]

    我见过的大多数网络测试示例只为每个测试夹具创建一次驱动程序,使用 [OneTimeSetUp] 而不是 [SetUp]。您真的要为每次测试更改驱动程序吗?如果是这样,并且如果您使用成员变量,那么您将无法并行运行测试用例,因为它们会相互干扰。幸运的是,对于许多测试库来说,并行运行夹具可以提供足够好的性能。

    更新:根据您的评论,很明显您希望每个测试用例有一个单独的驱动程序。你有两个选择...

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

    2. 并行运行案例,但不要使用 SetUp 方法创建驱动程序。相反,在每个测试中创建它。如果超过一行,请使用方法返回它。您的每个测试用例都将有一个单独的驱动程序,您可以消除测试相互交叉的任何可能性。

    FWIW,这个例子让我想再看看如何在不重写整个框架的情况下为并行测试提供更好的夹具分离。

    【讨论】:

    • 是的,我确实想为每个测试用例更改驱动程序。我组织它们的方式是基于每个问题(每个 sprint 的问题)。所以每个 Fixture 都包含问题,每个测试都是问题的变体。所以每个测试都需要它自己的驱动程序,因此它不会影响其他测试。这是设置它们的好方法吗?我是测试新手,被交给了这个项目并被告知要让它发生!所以“最佳实践”课程不会伤害我!
    • 在这种情况下,您有两个选择......不要并行运行案例或为每个测试用例使用单独的驱动程序。我将用详细信息编辑我的答案。顺便说一句...您远不是第一个刚接触测试但又试图处理 NUnit 中一些相当先进的概念的人。那是怎么回事?公司不能给人们一些简单的开始吗? :-)
    【解决方案2】:

    正如查理所说,它们必须是一个成员变量,以便在一个夹具(类)内的各种测试中进行作用域。

    我的误解是认为 SetUp 和 TearDown 与测试用例在同一范围内。我脑子里想着这就是 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());
        }
    }
    

    【讨论】:

    • 驱动程序会有所不同,直到代码碰巧按如下顺序执行:SetUp1 -> SetUp2 => Test1 => Test2,这很容易在并行环境中发生。
    • 所以我仍然可能遇到问题。我并行运行了 115 个测试,到目前为止没有发现任何问题。我正在考虑设置夹具订单。也许这将有助于进一步缓解问题。那有什么推荐吗?把它们都放在自己的固定装置里?这似乎与我见过的其他集成测试工作流程和模式适得其反。
    • 如果 NUnit 是为集成测试而设计的,那就更容易了。它不是。 :-( 但是,通过对每个测试用例使用单独的驱动程序进行隔离是一种单元测试模式。我见过的大多数 Web 集成测试都使用相同的浏览器实例进行多个测试。无论如何,您必须根据工具调整您的技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多