当前位置: 首页 > 知识库问答 >
问题:

使用TestWatcher记录测试用例中的断言失败

邢曦
2023-03-14

我正在使用JUnit和Apache Log4J来学习TDD和日志服务的最佳实践。我有一个GenericTask解释器类,它有一个方法ConnectToMySQL,它将尝试连接到MySQL数据库并返回java.sql.Connection类型的对象。

class GenericTaskInterpreter {

    /**
    * This method will attempt to connect to a MySQL database
    * and return an object of type java.sql.Connection
    */
    public Connection connectToMySQL() {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/TestDatabase", "root",
            "password");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

我有一个类GenericTaskInterpreterTests,在这里我为这个方法(和其他方法)编写了测试用例。

public class GenericTaskInterpreterTests extends TestCase {

    private static final GenericTaskInterpreter genericTaskInterpreter = new GenericTaskInterpreter();

    private static final Logger logger = LogManager.getLogger(GenericTaskInterpreterTests.class);

    private static boolean setUpIsDone = false;

    private static boolean tearDownIsDone = false;

    private static FileAppender fileAppender;

    @Rule
    public TestRule watchman = new TestWatcher() {

        private String watchedLog;

        // Overridden methods apply, succeeded, skipped, starting and finished....

    };

    protected void setUp() throws Exception {
        if (setUpIsDone) {
            return;
        }
        // Do the setup.
        fileAppender = new FileAppender();
        fileAppender.setName("FileLogger");
        fileAppender.setFile("/path/to/log4j-application.log");
        fileAppender.setLayout(new PatternLayout("%d %-5p [%c{1}.%M] %m%n"));
        fileAppender.setThreshold(Level.DEBUG);
        fileAppender.setAppend(true);
        fileAppender.activateOptions();

        LogManager.getRootLogger().addAppender(fileAppender);
        setUpIsDone = true;
        //logger.info("####### All configurations complete... #######");
        logger.info("####### Starting test cases... #######");

    }

    protected void tearDown() throws Exception {

        if (tearDownIsDone) {
            return;
        }
        // Do the teardown.
        //fileAppender.close();
        LogManager.getRootLogger().removeAppender(fileAppender);
        tearDownIsDone = true;   
    }

    public void testconnectToMySQLIfConnectionObjectIsNotNull() {
        assertNotNull(genericTaskInterpreter.connectToMySQL());
    }
}
  • 在这个测试用例场景中,如何使用TestWatcher记录断言失败

共有2个答案

江阳夏
2023-03-14
@Rule
public TestRule watchman = new TestWatcher() {

    @Override
    protected void succeeded(final Description description) {
        logger.info(String.format("Success: %s", description));
    }

    @Override
    protected void failed(final Throwable e, final Description description) {
        logger.info(String.format("Failed: %s", description), e);
    }

    @Override
    protected void starting(final Description description) {
        logger.info(String.format("Starting: %s", description));
    }

    @Override
    protected void finished(final Description description) {
        logger.info(String.format("Finished: %s", description));
    }

    };

如果您想在某个地方编写它,Log4J会做得很好,就像您已经做的那样。就个人而言,我会通过文件配置它,而不使用根记录器,但这只是一个细节。

周越泽
2023-03-14

当任何事件(设置、测试、清理失败/通过/跳过)发生时,您可能希望附加一个通用/离散结果文件。

如果并行运行测试,则必须同步对结果文件的日志写入

为此,您可能必须从jUnit API覆盖RunListener中的方法

http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.htmlRunListener类的

 类似资料:
  • 当我尝试执行一个新的单元测试用例时,它会显示以下错误。 注意:我没有特权设置路径,因为我已经将chrome web驱动程序放在D驱动器中。 测试在14:56开始。。。C:\Users\xxx.xxxx\PyCharm项目\Automation\venv\Scripts\python.exe“C:\Users\xx.xxx\AppData\Local\JetBrains\PyCharm社区版2019

  • 我在测试中有一段代码,使用Hamcrest 2.2检查结果列表是否包含某些属性: 当是一个普通的类时,这个工作非常好。但是在我将它更改为之后,Hamcrest的抱怨没有名为的属性: 是否有其他匹配器可以用来实现与之前相同的匹配?或者其他解决方法可以用来让它与记录一起工作?

  • 在我的测试用例中,我得到一个整数值: 然后,我想检查是否等于3或等于5,这两种情况都可以。所以,我做到了: 我运行了我的测试,日志显示是5,但是我上面的断言代码由于断言失败错误而失败。似乎我不能使用

  • 我已经使用mocha测试框架和chai断言库用TypeScript编写了一些测试(我对这三种测试都不熟悉),并看到抛出了一个错误,并且在下面的代码中调用了assert.fail()。不过,测试仍标记为通过。我很困惑为什么会发生这种情况,以及我是否在承诺上做错了什么。另外,如下所示,还有一个UnhandledPromiserEjectionWarning。我不明白为什么这被标记为未处理,因为我已经包

  • 问题内容: 当我运行一个完整的测试套件时,如果导致测试失败的异常出现在我的(SLF4J-)日志中,将很有帮助。实现此目的的最佳方法是什么? 我想要什么 是为我处理异常日志记录的junit4规则。代码 当然不起作用,因为我只能从try块中捕获异常。是否有解决方法以某种类似的简单通用方法实现? 顺便说一句,我现在在做什么 在创建异常时记录异常。但是最好在调用者和库之间的接口上记录异常,所以在我的情况下

  • 我有一个简单的测试用例: FileManager中的函数删除 /myDir下的所有文件,然后再次保留文件。 如上所述,我有一个。运行时,我可以按以下顺序查看所有打印: 但是,测试在失败。有两件事我不明白: > 我不明白,它在中失败了,为什么我仍然可以看到打印的,听起来就像是失败了,它没有停止运行,而是继续运行下一个测试?JUnit测试用例中的场景背后发生了什么?? 我不明白的另一件事是为什么tes