如何在单元测试之间使用变量?时间:2019-03-08 标签:c#webdriver

How to use variables between unit tests? c# webdriver

我是 webdriver 和 c# 的初学者。我想使用变量,从第一个测试到另一个测试,我该怎么做?我通过一些例子达到了这一点,但它不起作用。我看到第一个测试获得了正确的登录名,但是当我开始第二个测试并尝试发送密钥时,我发现 loginName 为空。 (代码是简短的版本,只是为了让您了解我正在尝试做什么)

[TestFixture]
public class TestClass
{
    private IWebDriver driver;
    private StringBuilder verificationErrors;
    private string baseURL;
    private bool acceptNextAlert = true;
    static public String loginName;
    static public String loginPassword;

    [SetUp]
    public void SetupTest()...

    [TearDown]
    public void TeardownTest()...

    [Test]
    public void GetLoginAndPassword()
    {
        loginName = driver.FindElement(By.XPath("...")).Text;
        loginPassword = driver.FindElement(By.XPath("...")).Text;
        Console.WriteLine(loginName);
    }
    [Test]
    public void Test1()
    {
        driver.FindElement(By.Id("UserNameOrEmail")).SendKeys(loginName);
        driver.FindElement(By.Id("Password")).SendKeys(loginPassword);
    }

问题是标有 TestAttribute 的方法没有按照您实现它们的相同顺序 运行。因此,Test1 运行 可能早于 GetLoginAndPassword)。您必须从构造函数中或在测试初始化​​期间或在每个测试之前调用该方法一次-运行.

[Test]
public void Test1()
{
    GetLoginAndPassword();
    driver.FindElement(By.Id("UserNameOrEmail")).SendKeys(loginName);
    driver.FindElement(By.Id("Password")).SendKeys(loginPassword);
}

可能您的 GetLoginAndPassword 甚至不是测试方法,而是测试中使用的方法(除非您在被测系统中确实有一个名为 GetLoginAndPassword 的方法)。但是因为有没有任何断言你的测试有点奇怪。

您不能(也不应该)在测试之间发送变量。测试方法独立于其他方法...实际上应该 Assert() 东西。

您的第一个方法 GetLoginAndPassword() 本身不是测试方法,而是实用方法。如果您使用 Selenium PageObject pattern,这可能是您的 PageObject class 的一个方法,您可以在实际 Test1() 方法的开头 运行。

单元测试的目的是测试特定单元(指一组密切相关的 classes)是否按规定工作。它并不是为了测试您完整的精心设计的程序是否按规定工作。

测试驱动设计的优点是你更清楚每个功能应该做什么。每个函数都应该将前提条件转换为指定的 post 条件,无论您在调用该函数之前或之后做了什么。

如果您的测试假定在您的测试 运行 之前其他测试是 运行,那么您将不会测试未调用其他函数的用例,或仅测试其中的一些函数调用了其他所需的函数。

由此得出结论,每个测试方法应该可以运行独立。每个测试都应该设置前提条件,调用函数并检查是否满足post条件。

But what if my function A only works correctly if other function B is called?

在那种情况下,A 的规范应该描述如果在调用 A 之前调用 B 会发生什么情况,以及如果在没有先调用 B 的情况下调用 A 会发生什么情况。

如果你的单元测试先测试 B 再测试 A,前提是 B 被调用,那么你不会测试 A 是否会在不调用 B 的情况下根据规范做出反应。

示例。

假设我们有一个除法器 class,它将任何数字除以给定的分母,该分母可以使用 属性.

设置
public class Divider
{
    public double Denominator {get; set;}

    public double Divide(double numerator)
    {
        return numerator / this.Denominator;
    }
}

很明显,在正常使用中,应该在调用 Divide 之前设置 属性 Denominator:

Divider divider = new divider(){Denominator = 3.14};
Console.WriteLine(divider.Divide(10);

您的规范应该描述如果在没有将 Denominator 设置为非零值的情况下调用 Divide 会发生什么。此描述如下:

If method Divide is called with a parameter value X and the value of Denominator is a non-zero Y, then the return value is X/Y. If the value of Denominator is zero, then the System.DivideByZeroException is thrown.

您应该至少创建两个测试。一种用于将分母设置为适当的非零值的用例,一种用于根本未设置分母的用例。如果您非常彻底:测试分母首先设置为非零值然后设置为零值的用例。