如何正确添加我的测试'错误存储到堆栈中,这样测试就不会停止执行
本文关键字:测试 执行 我的 添加 何正确 存储 错误 堆栈 | 更新日期: 2023-09-27 18:12:28
我使用SeleniumWebdriver c#来构建自动化测试。我还使用NUnit来标记测试方法(这样我就可以运行它们)。
在每个测试中都有几个验证,当第一个验证失败时,测试停止执行(抛出异常)。
我希望测试继续执行,以便发现更多的错误!
朋友们,请给我一些提示,告诉我怎么做才对。
我是这样想的:
- 我将在堆栈中添加一个错误,而不是在验证中抛出异常
- 当测试结束时,我检查堆栈是否为空
- 如果栈不是空的,我推到控制台所有错误和失败的测试
- 如果堆栈为空,则测试成功。
这些步骤好吗?有没有更好的办法?
我想这应该适合你。
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
这意味着——就像你想要的那样——如果一个验证阶段失败了,你可以继续测试其余的阶段。对此,您最好的选择可能是使用数据集进行单个测试,但是为了保持答案简单而相关,每个故障状态的测试足以满足您的需求。
我用另一种方法解决了我的问题:
- 我创建了一组方法,在执行任何测试之前执行一次([testfixturesetupatattribute] in NUnit);
- 在这组方法中,我执行我将检查的主要操作结果(在我的情况下,我购买彩票);
- 在每个测试([test]在NUnit)我检查一个断言。
现在我有一个不包含任何验证的主操作。这个动作完成后,我检查所有需要的断言。