如何正确添加我的测试'错误存储到堆栈中,这样测试就不会停止执行

本文关键字:测试 执行 我的 添加 何正确 存储 错误 堆栈 | 更新日期: 2023-09-27 18:12:28

我使用SeleniumWebdriver c#来构建自动化测试。我还使用NUnit来标记测试方法(这样我就可以运行它们)。

在每个测试中都有几个验证,当第一个验证失败时,测试停止执行(抛出异常)。

我希望测试继续执行,以便发现更多的错误!

朋友们,请给我一些提示,告诉我怎么做才对。

我是这样想的:

  1. 我将在堆栈中添加一个错误,而不是在验证中抛出异常
  2. 当测试结束时,我检查堆栈是否为空
  3. 如果栈不是空的,我推到控制台所有错误和失败的测试
  4. 如果堆栈为空,则测试成功。

这些步骤好吗?有没有更好的办法?

如何正确添加我的测试'错误存储到堆栈中,这样测试就不会停止执行

我想这应该适合你。

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

这意味着——就像你想要的那样——如果一个验证阶段失败了,你可以继续测试其余的阶段。对此,您最好的选择可能是使用数据集进行单个测试,但是为了保持答案简单而相关,每个故障状态的测试足以满足您的需求。

我用另一种方法解决了我的问题:

  1. 我创建了一组方法,在执行任何测试之前执行一次([testfixturesetupatattribute] in NUnit);
  2. 在这组方法中,我执行我将检查的主要操作结果(在我的情况下,我购买彩票);
  3. 在每个测试([test]在NUnit)我检查一个断言。

现在我有一个不包含任何验证的主操作。这个动作完成后,我检查所有需要的断言。