【问题标题】:MSTest Unit Test - handling exceptionsMSTest 单元测试 - 处理异常
【发布时间】:2012-10-13 04:47:20
【问题描述】:

我有一个使用 Selenium WebDriver 的 C# 单元测试来测试是否存在链接。代码如下:

   [TestMethod()]
    public void RegisterLinkExistTest()
    {
        IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1"));
        Assert.AreEqual("Register here", registerLink.Text, "Failed");
    }

我想看看如果我将 PartialLinkText 设置为“Register1”而不是“Register”会发生什么。 MSTest 未能通过 Selenium 引发的异常而导致此测试。我希望 Assert.AreEqual 执行,但 MSTest 在上一行抛出异常。我知道我可以使用 ExpectedException 属性来指定“OpenQA.Selenium.NoSuchElementException”,但我不想这样做,因为我不期待那个异常。我该如何处理?

【问题讨论】:

  • 不清楚,你显然知道它不应该存在,因此你会得到一个例外。因此,测试的行为符合预期。
  • 我不希望 MSTest 在这种情况下抛出未处理的异常。例如,如果我正在寻找一个正确的链接“注册”并且该站点没有它,我将如何使代码不抛出未处理的异常而是执行 Assert 语句?

标签: c#-4.0 mstest


【解决方案1】:

正如@AD.Net 所说,您的测试按预期工作。

如果找不到链接,您可以捕获异常,但我不明白这样做的意义。如果未找到链接,则 registerLink 将是 null。断言空对象的属性有什么意义?

您的测试工作正常,只需删除 Assert 行。

但是,如果您还想测试链接的文本,请尝试以下代码:

[TestMethod()]
public void RegisterLinkExistTest()
{
    try
    {
        IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1"));
        Assert.AreEqual("Register here", registerLink.Text, "Register's link text mismatch");
    }
    catch(NoSuchElementException)
    {
        Assert.Fail("The register link was not found");
    }
}

编辑

你可以分开你的测试,第一个测试将检查链接是否存在,第二个将断言它的属性。

[TestMethod()]
public void RegisterLinkExistTest()
{
    IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1"));
}

[TestMethod()]
public void RegisterLinkTextTest()
{
    IWebElement registerLink = genericBrowserDriver.FindElement(By.PartialLinkText ("Register1"));
    Assert.AreEqual("Register here", registerLink.Text, "Register's link text mismatch");
}

然后使用OrderedTest 并按此顺序添加它们,以便首先执行RegisterLinkExistTest。如果失败,则第二个测试将不会运行。

【讨论】:

  • 优秀的回复。但是,一个快速的问题。我读过不建议在单元测试中添加 try...catch 块的文章。话虽如此,我可以检查一下 FindElement 方法是否返回 null 然后执行 Assert.Fail 吗?
  • 嗯,起初,我认为您的测试不是单元测试,而是自动化的 GUI 测试。 FindElement 方法永远不会返回 null,如果找不到您的链接,它总是会抛出异常。您可以做的是将两个测试分开,第一个将检查链接是否存在,第二个将断言它的属性。然后使用OrderedTest 一个接一个地执行它们。如果第一个失败,第二个将不会被执行。如果您想了解更多详细信息,我可以将其发布在我的答案中。
  • 感谢您的回复。请发表您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多