【问题标题】:Selenium: How to stop test sequence?Selenium:如何停止测试序列?
【发布时间】:2019-10-31 00:42:08
【问题描述】:

在 Visual Studio 中使用 Selenium。使用 NUnit 对我的测试用例进行排序。

我正在编写一个测试用例,将两个序列号与这样的 if 语句进行比较:

[Test]
public void CompareVariables()
{
   if (string.Equals(serialNumberInfo, serialNumberReport))
      Console.WriteLine($"{serialNumberInfo} and {serialNumberReport} are a match! Proceed!");
   else
      Console.WriteLine($"{serialNumberInfo} and {serialNumberReport} don't match! Cancel test!");
      //method for stopping test missing!

如果序列号不匹配,我希望能够中止其余的测试序列。

我可以在else 部分放入“结束/停止测试”方法或类似方法吗?

【问题讨论】:

  • 中止是什么意思?您的意思是停止当前正在执行的操作并报告失败/通过?
  • 是的!停止测试用例,就像 Visual Studio 在无法继续测试用例时通常会做的那样。
  • 那么你能简单地抛出一个异常吗?这将使测试失败并中止测试用例
  • 我不熟悉抛出异常。怎么写?
  • @JamiePeacock 我可以用这个吗:throw new System.ArgumentException("Serial numbers don't match")

标签: c# visual-studio selenium if-statement


【解决方案1】:

我认为你有几个选择。

1) 简单地抛出一个异常(并且测试失败)

抛出异常将使单元测试失败。有很多不同类型的异常,但基础只是Exception。您可以检查可用的不同类型的异常here。在可能的情况下,尽量选择最能代表错误的异常(例如使用 ArgumentException 或其派生词等糟糕的参数)。

您的测试将如下所示:

[Test]
public void CompareVariables()
{
   if (!string.Equals(serialNumberInfo, serialNumberReport))
      throw new Exception($"{serialNumberInfo} and {serialNumberReport} don't match! Cancel test!");

   // The rest of your tests (only run if serialNumberInfo and serialNumberReport) are equal.
}

2) 使用断言(并通过测试)

单元测试通常应该断言发生了一些可取的事情。如果那件事没有发生,那么应该抛出异常(通常由某些断言框架为您处理)。

所以你可以翻转测试来做到这一点:

[Test]
public void CompareVariables()
{
   serialNumberInfo.ShouldBe(serialNumberReport);

   // The rest of your tests (only run if serialNumberInfo and serialNumberReport) are equal.
}

这是通过Shouldly 完成的,但是有无数的断言框架,所以选择你最喜欢的。 (mstest 内置了一个,但我发现它的可读性较差,但这是个人喜好)。

请注意,仅当您想明确确保它应该发生时才使用断言。 IE。这必须是真实的,我的测试才能通过,而不是如果发生这种情况然后中止。这很难解释,所以我希望这是有道理的?

出现错误时的例外,应该正确时的断言。

3) 离开测试(并通过测试)

如果测试退出而没有抛出异常(手动或通过断言框架),则该测试被视为通过测试。因此,如果您想将此视为通过,您只需从测试中返回即可。

[Test]
public void CompareVariables()
{
   if (string.Equals(serialNumberInfo, serialNumberReport))
   {
      Console.WriteLine($"{serialNumberInfo} and {serialNumberReport} are a match! Proceed!");
   }
   else
   {
        Console.WriteLine($"{serialNumberInfo} and {serialNumberReport} don't match! Cancel test!");
        return;
   }

   // The rest of your tests

}

这会将测试标记为通过,但意味着测试中的其余操作不会运行。不过我会尽量不这样做——除非你真的明白你为什么要这样做,因为你可以在不知道它们为什么通过的情况下开始通过测试(即不断言任何东西)

希望对你有帮助

【讨论】:

    【解决方案2】:

    如果您想提前结束测试而不失败,只需使用 return。

    [Test]
    public void MyTest() {
    
        //Do some stuff
        if(!shouldContinue) {
    
            return;
    
        }
    
    }
    

    我这样做是合理的,因为某些条件可能需要额外的断言,而其他条件可能不会。抛出异常将使测试失败。这不会失败。

    编辑:我刚刚注意到其他响应者在他们的回答结束时提到了这一点。所以别理我:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2015-03-05
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多