即使assert语句在selenium中使用Junit 4框架失败也会继续执行

时间:2016-07-23 11:11:56

标签: unit-testing selenium selenium-webdriver junit ui-testing

在我的测试用例中,它必须使用多个断言。问题是如果一个断言失败则执行停止。我希望测试用例在遇到断言失败后继续执行,并且在执行后显示所有断言失败。

例如:

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对condition2失败,那么它应该继续执行并在完成执行后显示所有失败。

3 个答案:

答案 0 :(得分:4)

对于纯粹的JUnit解决方案,请使用 ErrorCollector TestRule来处理您的声明。

ErrorCollector 规则在测试执行完成之前不会报告。

import java.awt.Dimension;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.event.MouseInputAdapter;

public class Test extends JFrame {

    private JLabel label;
    private int click_count = 0;

    public Test(){

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label = new JLabel("click count " + click_count);
        label.setPreferredSize(new Dimension(200,100));
        label.addMouseListener(new MouseInputAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                labelClicked();
            }
        });

        add(label);
        validate();
        pack();
    }

    /**
     *
     */
    private void labelClicked() {
        click_count++;
        updateLabel();
        repaint();

    }

    /**
     *
     */
    private void updateLabel() {

        label.setText("click count " + click_count);
    }

    public static void main(String[]arghs){

        Test frame = new Test();
        frame.setVisible(true);
    }
}

在您的具体示例中:

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);

答案 1 :(得分:1)

您要寻找的功能称为Soft Assertion,请尝试assertj

java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.youtube.api.service.START }
                                                     at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1209)
                                                     at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1308)
                                                     at android.app.ContextImpl.bindService(ContextImpl.java:1286)

软断言将允许执行到下一步而不会在失败时抛出异常。在最后 SoftAssertions soft = new SoftAssertions(); soft.assertThat(<things>).isEqualTo(<other_thing>); soft.assertAll(); 方法中,将所有收集的错误抛出一次。

答案 2 :(得分:0)

这里的另一个选择是许多人说你应该总是做的最佳实践:只在每个测试用例中加上一个断言。

通过这样做,每个潜在的失败都以某种方式彼此隔离;并且你直接得到你正在寻找的东西 - 因为JUnit将准确地告诉你,哪些测试失败了,哪些测试失败了。无需介绍其他概念。

(你知道,即使像ErrorCollector或SoftAssertions这样的其他概念非常容易和直接使用 - 它们会给你的代码增加一些复杂性;使它更难阅读和理解)