如何在单元测试之间使用变量? c#webdriver

时间:2015-12-08 12:32:51

标签: c# unit-testing selenium webdriver

我在网络驱动程序和c#中更加优秀。我想使用变量,从另一个测试的第一次测试开始,我该怎么做?我通过一些例子得到了这一点,但它不起作用。我看到第一个测试正确登录,但是当我开始第二个测试并尝试发送密钥时,我得到的loginName为null。 (代码是简短的版本,只是为了让你知道我想做什么)

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

3 个答案:

答案 0 :(得分:3)

您不能(也不应该)在测试之间发送变量。测试方法独立于另一个......实际上应该是Assert()

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

答案 1 :(得分:0)

问题是标有TestAttribute的方法不按照您实现它们的顺序依次运行。因此Test1可能会在GetLoginAndPassword之前很久就运行[Test] public void Test1() { GetLoginAndPassword(); driver.FindElement(By.Id("UserNameOrEmail")).SendKeys(loginName); driver.FindElement(By.Id("Password")).SendKeys(loginPassword); } 。您必须在构造函数中或在测试初始化​​期间或在每次测试运行之前调用该方法一次。

GetLoginAndPassword

可能你的GetLoginAndPassword甚至不是一种测试方法,而是测试中使用的方法(除非你的系统中有一个名为dos.writeBytes(twoHyphens + boundary + twoHyphens + end); 的方法。但是因为没有断言在你所有的测试中都有些奇怪。

答案 2 :(得分:0)

单元测试的目的是测试特定单元(意味着一组密切相关的类)是否按指定的方式工作。它并不意味着测试您的完整复杂程序是否按指定的方式工作。

测试驱动设计的优势在于您更了解每个功能应该做什么。无论你在调用函数之前或之后做了什么,每个函数都假设将一个前置条件转换为一个指定的后置条件。

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

这导致了每个测试方法应该能够独立运行的结论。每个测试都应该设置前提条件,调用函数并检查是否满足后置条件。

  

但是如果我的函数A只在其他函数B被调用时才能正常工作呢?

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

如果您的单元测试首先测试B,然后测试B的前提条件是B,则不会测试A是否会根据规范做出反应而不调用B.

实施例

假设我们有一个分隔符类,它将任何数字除以可以使用属性设置的给定分母。

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会发生什么。这种描述就像是:

  

如果使用参数值X调用方法Divide并且Denominator的值为非零Y,则返回值为X / Y.如果Denominator的值为零,则抛出System.DivideByZeroException。

您应该至少创建两个测试。一个用于Denominator被设置为适当的非零值的用例,一个用于Denominator根本没有设置的用例。如果你非常彻底:对用例的测试,首先将Denominator设置为非零值,然后设置为零值。