Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确添加我的测试';堆栈中的错误,因此测试不会';不要停止执行?_C#_Testing_Selenium Webdriver_Nunit - Fatal编程技术网

C# 如何正确添加我的测试';堆栈中的错误,因此测试不会';不要停止执行?

C# 如何正确添加我的测试';堆栈中的错误,因此测试不会';不要停止执行?,c#,testing,selenium-webdriver,nunit,C#,Testing,Selenium Webdriver,Nunit,我使用SeleniumWebdriver C#构建自动化测试。 我还使用NUnit标记测试方法(以便运行它们) 在每个测试中都有几个验证,当第一个验证失败时,测试停止执行(抛出异常) 我希望测试继续执行,以便发现更多错误 伙计们,给我一个正确的方法 我会这样想: 我将向堆栈中添加一个错误,而不是在验证中抛出异常 当测试结束时,我检查堆栈是否为空 如果堆栈不是空的,我将推到控制台来控制所有错误并使测试失败 如果堆栈为空,则测试成功通过 这些步骤好吗?有更好的办法吗?我想这对你应该有用 class

我使用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
    

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

    我用下一种方法解决了我的问题。

  • 我创建了一组方法,这些方法在执行任何测试之前执行一次(NUnit中的[TestFixtureSetUpAttribute])
  • 在这组方法中,我会检查主要操作的结果(在我的情况下,我会买彩票)
  • 在每个测试中(NUnit中的[test])我检查一个断言

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

    如果我必须检查购买产品,我必须检查:首页的价格、折扣、后端的价格等。如果我运行不同的测试来检查所有这些细节,这将花费大量的时间,不是吗?这可能很好,但是测试本身应该尽可能简洁,以减少重复。您是否有常规的单元测试套件以及Selenium测试,用于单独测试后端?还是所有的测试都是通过前端完成的?没有单元测试,只有使用Selenium编写的测试。我使用它们测试前端和后端。我所说的后端是指网站的管理面板。如果是这样的话,你可能不得不忍受它所花费的时间。这超出了问题的范围,但是您应该考虑为各个类添加单元测试,以减少在SE测试中所需的错误检查量,从而减少测试运行时间。