【问题标题】:Ignore Assertion failure in a testcase (JUnit)忽略测试用例中的断言失败(JUnit)
【发布时间】:2011-02-28 20:27:55
【问题描述】:

目前,我正在使用 java 和 selenium rc 编写自动化测试。

我想验证用户界面上的所有内容,功能如下:

public String UITest() throws IOException {

    String result="Test Start<br />";

    try {
        openfile(1);
        for (String url : uiMaps.keySet()) {
            selenium.open(url);
            for (String item : uiMaps.get(url)) {                   
                assertEquals(url+" check: " + item, true,selenium.isTextPresent(item));
                result+=url+" check: " + item+" : OK<br />";
            }
        }
    } catch (AssertionError e) {
        result+=e.getMessage();
    }
    result+="Test finished<br />";
    return result;
}

该函数假设返回一个包含测试信息的字符串。但是,一旦发生断言错误,该函数就会停止。

所以,我想知道是否有办法忽略失败并继续执行所有断言验证。

感谢您的帮助

【问题讨论】:

    标签: java junit qa


    【解决方案1】:

    你可以使用JUnit 4 error collector rule:

    ErrorCollector 规则允许 执行测试后继续 发现第一个问题(对于 例如,收集所有 表格中的行不正确,并报告 一次性)

    例如,您可以编写这样的测试。

    public static class UsesErrorCollectorTwice {
      @Rule
      public ErrorCollector collector= new ErrorCollector();
    
      @Test
      public void example() {
        String x = [..]
        collector.checkThat(x, not(containsString("a")));
        collector.checkThat(y, containsString("b"));             
      }
    }
    

    错误收集器使用 hamcrest 匹配器。这取决于你的喜好,这是积极的还是消极的。

    【讨论】:

    • 它似乎会执行所有的测试,即使有一个失败。但我有另一个问题。我检查了 API,它说表中所有不正确的行,并一次报告它们。我的问题是我可以通过什么方式获取表格的信息?谢谢。
    • 由于原始errorcollector错误列表的可访问性,我通过继承junit实现了自己的errorcollector。现在它起作用了。非常感谢您的帮助。
    • @user638297 是的,实现一个完全符合您要求的 MethodRule 并不难。你能收集到你要找的所有信息吗?
    • JUnit 5 有什么类似的吗?
    【解决方案2】:

    来自 Selenium documentation:

    所有 Selenium 断言都可以在 3 种模式下使用:“assert”、“verify”和“waitFor”。例如,您可以“assertText”、“verifyText”和“waitForText”。当“断言”失败时,测试被中止。 当“验证”失败时,测试将继续执行并记录失败。这允许单个“断言”来确保应用程序位于正确的页面上,然后是一堆“验证”断言来测试表单字段值、标签等。

    【讨论】:

    • 我认为问题在于 JUnit 的 assertEquals 函数而不是 selenium,因为我使用的 selenium 函数是“isTextPresent”,它只负责返回一个布尔值。如果我错了,请纠正我。谢谢。
    • 根据文档,您始终可以选择:assert TextPresent、verify TextPresent 和 is TextPresent。每个版本都有不同的行为。
    【解决方案3】:

    我相信你现在已经自己弄清楚了:try-catch 应该在 for 循环内,而不是在它之外;)

    【讨论】:

      【解决方案4】:

      不要在函数中断言任何东西。改为返回说 null ,让调用它的人继续执行,但如果函数返回 null 则失败

      【讨论】:

        猜你喜欢
        • 2020-10-08
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多