0

我正在为 UI 编写测试,并且正在使用断言语句来检查断言失败时是否存在带有消息字符串的元素。我希望测试继续检查其他元素,即使它找不到元素。我还希望在测试结束时显示断言失败时的有用消息。

Assert.IsTrue(IsElementPresent(By.XPath("//a/img[@src='/Img1.png']")), "Img1 not present");
Assert.IsTrue(IsElementPresent(By.XPath("//a/img[@src='/Img2.png']")), "Img2 not present");
Assert.IsTrue(IsElementPresent(By.XPath("//a/img[@src='/Img3.png']")), "Img3 not present");

是否有替代使用断言语句或在尝试捕获中使用断言语句以继续测试?

4

3 回答 3

1

您可以保留错误消息,然后在最后检查。下面是可怕的代码,你想整理一下,但它让你知道你能做什么。

[Test]
public void All_images_are_present()
{
    string message = string.Empty;

    message = AssertImage("Img1");
    message += AssertImage("Img2");
    message += AssertImage("Img3");
    ... etc ...

    Assert.That(message, Is.Empty, message);
}

private static string AssertImage(string imageName)
{
    string imagePath = string.Format(@"//a/img[@src='/{0}.png']", imageName);

    if (IsElementPresent(By.XPath("//a/img[@src='/Img1.png']")))
        return string.Empty;

    return string.Format("{0} not present;");    
}

但是,最好进行三个不同的测试并检查每个图像中的每个图像。理想情况下,测试应分别检查一项功能。

于 2013-04-15T15:44:16.267 回答
0

解决方案的最佳方法是使用参数化测试。在 NUnit 中,您可以使用[TestCase]属性来实现。

以下示例被重写为参数化测试:

[TestCase("//a/img[@src='/Img1.png']")]
[TestCase("//a/img[@src='/Img2.png']")]
[TestCase("//a/img[@src='/Img3.png']")]
public void ElementIsPresent(string xpath)
{
    Assert.IsTrue(IsElementPresent(By.XPath(xpath)));
}

现在,您可以区分两种类型的红色测试:期望不同的测试(这里:如果返回 false 而不是 true)和抛出异常的方式。

您的方法还有另一个问题。正如 Andy Nichols 所提到的,您在一项测试中测试了多个逻辑断言。单元测试的每个测试不应超过一个逻辑断言。按照上面的参数化测试保证你在一个测试中测试一个逻辑断言。

于 2013-11-21T10:34:28.357 回答
0

在编程中,我们称之为“ if 语句”。 Assert.IfTrue(condition, message)只是以下的简写形式:

if (condition) then
    print message
    abort_execution
end-if
于 2013-04-15T21:23:35.780 回答