Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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# 是否有替代方法来完成Assert的功能,并在测试失败时完全执行测试,而不使用Try-Catch?_C#_Xpath_Selenium_Nunit_Selenium Webdriver - Fatal编程技术网

C# 是否有替代方法来完成Assert的功能,并在测试失败时完全执行测试,而不使用Try-Catch?

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

我正在为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.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(条件、消息)的东西。