即使assert语句在使用Junit 4框架的selenium中失败,仍继续执行[duplicate]

cwdobuhd  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(131)

此问题在此处已有答案

Don't let test stop on failure(1个答案)
六年前就关门了。
在我的测试用例中,必须使用多个Assert。问题是如果一个Assert失败,那么执行就会停止。我希望该测试用例即使在遇到Assert失败后也能继续执行,并且在执行后显示所有Assert失败。
例如:

assertTrue("string on failure",condition1);
assertTrue("string on failure",condition2);
assertTrue("string on failure",condition3);
assertTrue("string on failure",condition4);
assertTrue("string on failure",condition5);

在这个例子中,我希望如果assert在条件2下失败,那么它应该继续执行,并在完成执行后显示所有失败。

pbossiut

pbossiut1#

对于纯JUnit解决方案,请使用ErrorCollectorTestRule来处理Assert。
在测试执行完成之前,ErrorCollector规则不会返回报告。

import org.hamcrest.core.IsEqual;
import org.hamcrest.core.IsNull;
import org.hamcrest.text.IsEmptyString;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;

public class ErrorCollectorTest {
    @Rule
    public ErrorCollector collector = new ErrorCollector();

    @Test
    public void testMultiAssertFailure() {
        collector.checkThat(true, IsEqual.equalTo(false));
        collector.checkThat("notEmpty", IsEmptyString.isEmptyString());
        collector.checkThat(new Object(), IsNull.nullValue());
        collector.checkThat(null, IsNull.notNullValue());

        try {
            throw new RuntimeException("Exception");
        } catch (Exception ex){
            collector.addError(ex);
        }
    }
}

在您的具体示例中:

assertTrue("string on failure",condition1);
assertTrue("string on failure",condition2);
assertTrue("string on failure",condition3);
assertTrue("string on failure",condition4);
assertTrue("string on failure",condition5);

会变成

Matcher<Boolean> matchesTrue = IsEqual.equalTo(true);
collector.checkThat("String on Failure", condition1, matchesTrue);
collector.checkThat("String on Failure", condition2, matchesTrue);
collector.checkThat("String on Failure", condition3, matchesTrue);
collector.checkThat("String on Failure", condition4, matchesTrue);
collector.checkThat("String on Failure", condition5, matchesTrue);
eeq64g8w

eeq64g8w2#

您要查找的功能称为软Assert,请尝试assertj

SoftAssertions soft = new SoftAssertions();
    soft.assertThat(<things>).isEqualTo(<other_thing>);
    soft.assertAll();

软Assert将允许执行到下一个步骤,而不会在失败时抛出异常。在assertAll()方法结束时,一次性抛出所有收集的错误。

xiozqbni

xiozqbni3#

这里的另一个选项是许多人说无论如何都应该一直做的最佳实践:在每个测试用例中只放置一个Assert。
通过这样做,每个潜在故障以某种方式彼此隔离;并且您可以直接得到您所要查找的内容--因为JUnit将准确地告诉您哪些测试失败了,哪些测试通过了,而无需引入其他概念。
(您可以看到,即使那些其他概念(如ErrorCollector或SoftAssertions)非常容易使用,它们也会给代码增加一点复杂性;使其更难阅读和理解)

相关问题