C# 是否有替代方法来完成Assert的功能,并在测试失败时完全执行测试,而不使用Try-Catch?
我正在为UI编写测试,并使用assert语句检查当assert失败时,元素是否包含消息的字符串。我希望测试继续检查其他元素,即使它找不到元素。我还希望得到有用的消息,显示测试结束时断言失败的时间C# 是否有替代方法来完成Assert的功能,并在测试失败时完全执行测试,而不使用Try-Catch?,c#,xpath,selenium,nunit,selenium-webdriver,C#,Xpath,Selenium,Nunit,Selenium Webdriver,我正在为UI编写测试,并使用assert语句检查当assert失败时,元素是否包含消息的字符串。我希望测试继续检查其他元素,即使它找不到元素。我还希望得到有用的消息,显示测试结束时断言失败的时间 Assert.IsTrue(IsElementPresent(By.XPath("//a/img[@src='/Img1.png']")), "Img1 not present"); Assert.IsTrue(IsElementPresent(By.XPath("//a/img[@src='/Img2
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");
除了使用assert语句或在try catch中使用assert语句外,还有其他方法可以继续测试吗?您可以保留错误消息,然后在最后进行检查。下面的代码很糟糕,你可能想把它整理一下,但它给出了你可以做什么的想法
[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;");
}
但是,最好有三个不同的测试并检查每个图像中的每个图像。理想情况下,测试应该检查每个功能的一部分。在编程中,我们称之为“”
Assert.IfTrue(条件、消息)
仅是以下内容的简写形式:
if (condition) then
print message
abort_execution
end-if
解决方案的最佳方法是使用参数化测试。在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提到的,您在一个测试中测试了多个逻辑断言。单元测试在每个测试中只能有一个逻辑断言。按照上面的参数化测试可以保证您在一个测试中测试一个逻辑断言。我担心代码行与这样的解决方案相乘,因为我的所有测试都将检查几十个元素。@Anthony Don。根据你的评论,我已经进行了编辑,以便在不加载额外代码行的情况下更容易地检查更多元素。我感谢你的努力,安迪,但我应该说得更清楚。我正在做UI测试,一个测试就是进入登录页面。然后检查标题、公司徽标、姓名输入标签、密码标签是否存在。然后登录并检查“注销”文本是否存在,以确保登录成功。因此,它不会按照您建议的方式工作。该问题询问为什么“mstest”assert try catch不能正常工作。我想知道的是:除了执行断言或使用try-catch,还有没有其他方法能够断言并显示错误消息。这是一个有趣的分解。我仍然是一个编程新手,所以我认为有一些我不知道的替代方案,忽略了“中止执行”部分。类似于Verify.IfTrue(条件、消息)的东西。