C# 如何正确添加我的测试';堆栈中的错误,因此测试不会';不要停止执行?
我使用SeleniumWebdriver C#构建自动化测试。 我还使用NUnit标记测试方法(以便运行它们) 在每个测试中都有几个验证,当第一个验证失败时,测试停止执行(抛出异常) 我希望测试继续执行,以便发现更多错误 伙计们,给我一个正确的方法 我会这样想:C# 如何正确添加我的测试';堆栈中的错误,因此测试不会';不要停止执行?,c#,testing,selenium-webdriver,nunit,C#,Testing,Selenium Webdriver,Nunit,我使用SeleniumWebdriver C#构建自动化测试。 我还使用NUnit标记测试方法(以便运行它们) 在每个测试中都有几个验证,当第一个验证失败时,测试停止执行(抛出异常) 我希望测试继续执行,以便发现更多错误 伙计们,给我一个正确的方法 我会这样想: 我将向堆栈中添加一个错误,而不是在验证中抛出异常 当测试结束时,我检查堆栈是否为空 如果堆栈不是空的,我将推到控制台来控制所有错误并使测试失败 如果堆栈为空,则测试成功通过 这些步骤好吗?有更好的办法吗?我想这对你应该有用 class
这些步骤好吗?有更好的办法吗?我想这对你应该有用
class Asserts
{
private static StringBuilder _stack;
[SetUp]
public void SetUp()
{
_stack = new StringBuilder();
}
[TearDown]
public void TearDown()
{
if (_stack.Lenght != 0) Assert.Fail(_stack.ToString());
}
[Test]
public void Test()
{
AssertHelper(() => Assert.AreEqual(0, 0));
AssertHelper(() => Assert.IsNotNull(null));
AssertHelper(() => Assert.AreEqual(3, 4));
AssertHelper(() => Assert.AreEqual(1, 1));
}
private static void AssertHelper(Action assert)
{
try
{
assert();
}
catch (AssertionException e)
{
_stack.Append(e.Message);
}
}
}
但是好主意是每次测试只进行一次验证。通常,您希望您的测试一次只验证一件事情。如果一个操作有两个步骤需要断言,考虑进行如下测试:
UserForm_FirstNameMissing_ThrowsException
UserForm_SecondNameMissing_ThrowsException
UserForm_AgeTooLarge_ThrowsException
而不是单一的测试,比如:
UserForm_TestValidation
这意味着——正如您所希望的那样——如果验证的一个阶段失败,您可以继续测试其余的阶段。对此,您最好的选择可能是使用数据集进行单一测试,但要保持答案简单但相关,每个故障状态的测试足以满足您的需要。我用下一种方法解决了我的问题。:
所以现在我有一个不包括任何验证的主要动作。完成此操作后,我会检查所有需要的断言。如果我必须检查购买产品,我必须检查:首页的价格、折扣、后端的价格等。如果我运行不同的测试来检查所有这些细节,这将花费大量的时间,不是吗?这可能很好,但是测试本身应该尽可能简洁,以减少重复。您是否有常规的单元测试套件以及Selenium测试,用于单独测试后端?还是所有的测试都是通过前端完成的?没有单元测试,只有使用Selenium编写的测试。我使用它们测试前端和后端。我所说的后端是指网站的管理面板。如果是这样的话,你可能不得不忍受它所花费的时间。这超出了问题的范围,但是您应该考虑为各个类添加单元测试,以减少在SE测试中所需的错误检查量,从而减少测试运行时间。