如何在单元测试之间使用变量?时间: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.
您应该至少创建两个测试。一种用于将分母设置为适当的非零值的用例,一种用于根本未设置分母的用例。如果您非常彻底:测试分母首先设置为非零值然后设置为零值的用例。
我是 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.
您应该至少创建两个测试。一种用于将分母设置为适当的非零值的用例,一种用于根本未设置分母的用例。如果您非常彻底:测试分母首先设置为非零值然后设置为零值的用例。