Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用TestWatcher记录测试用例中的断言失败 背景/场景:_Java_Unit Testing_Junit_Log4j - Fatal编程技术网

Java 使用TestWatcher记录测试用例中的断言失败 背景/场景:

Java 使用TestWatcher记录测试用例中的断言失败 背景/场景:,java,unit-testing,junit,log4j,Java,Unit Testing,Junit,Log4j,我正在使用JUnit和ApacheLog4J来学习TDD和日志服务的最佳实践。我有一个GenericTaskInterpreter类,它有一个方法connectToMySQL,该方法将尝试连接到MySQL数据库并返回类型为java.sql.Connection的对象 class GenericTaskInterpreter { /** * This method will attempt to connect to a MySQL database * and retu

我正在使用JUnit和ApacheLog4J来学习TDD和日志服务的最佳实践。我有一个
GenericTaskInterpreter
类,它有一个方法
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
,在这里我为这个方法(和其他方法)编写了测试用例

问题:
  • 在这个测试用例场景中,如何使用TestWatcher记录断言失败
  • 有没有比使用TestWatcher更好的替代方法
如果您想在某个地方编写它,Log4J会做得很好,正如您已经做的那样。就我个人而言,我会通过文件配置它,而不使用根记录器,但这只是一个细节

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

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


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

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

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

为此,您可能必须从JUnitAPI重写RunListener中的方法


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

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

为此,您可能必须从JUnitAPI重写RunListener中的方法


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

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

为此,您可能必须从JUnitAPI重写RunListener中的方法


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

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

为此,您可能必须从JUnitAPI重写RunListener中的方法



RunListener类的

是否有替代方案?取决于:您的TestWatcher应该如何处理这些信息?目前,将其写入日志文件。是否有其他方法?取决于:您的TestWatcher应该如何处理这些信息?目前,将其写入日志文件。是否有其他方法?取决于:您的TestWatcher应该如何处理这些信息?目前,将其写入日志文件。是否有其他方法?取决于:您的TestWatcher应该如何处理这些信息?目前,将其写入日志文件。
2015-08-12 15:29:17828信息[generictaskintertests.setUp]#####启动测试用例#######。这是写入日志文件的行,而不是
成功
失败
开始
完成
方法中的消息。您可能遇到了与我们最近遇到的问题相同的问题:
扩展测试用例
似乎导致使用JUnit 3.8运行程序执行测试。您可以删除
扩展的Testcase
(并显式地使用
Assert.assertNotNull
等,可能使用静态导入),或者您可以将行
@RunWith(BlockJUnit4ClassRunner.class)
添加到您的testclass中。类似的问题,请参阅此帖子:谢谢Florian。我只是照你的建议做了,一切都很顺利。这是本书的要点。如果我理解正确的话,注释
@RunWith(BlockJUnit4ClassRunner.class)
相对来说没有删除
扩展TestCase
那么重要。您可能不需要两者兼而有之。只要删除
扩展测试用例
,就足以让它使用最新的运行程序运行。如果您想保留扩展,那么@RunWith只是一种可能性。就我个人而言,只有在真正需要的时候,我才尝试使用@RunWith,不需要把代码弄得乱七八糟。
2015-08-12 15:29:17828信息[GenericTaskInterpreterTests.setUp]######启动测试用例#######。这是写入日志文件的行,而不是
成功
失败
开始
完成
方法中的消息。您可能遇到了与我们最近遇到的问题相同的问题:
扩展测试用例
似乎导致使用JUnit 3.8运行程序执行测试。您可以删除
扩展的Testcase
(并显式地使用
Assert.assertNotNull
等,可能使用静态导入),或者您可以将行
@RunWith(BlockJUnit4ClassRunner.class)
添加到您的testclass中。类似的问题,请参阅此帖子:谢谢Florian。我只是照你的建议做了,一切都很顺利。这是本书的要点。如果我理解正确的话,注释
@RunWith(BlockJUnit4ClassRunner.class)
相对来说没有删除
扩展TestCase
那么重要。您可能不需要两者兼而有之。只要删除
扩展测试用例
,就足以让它使用最新的运行程序运行。如果您想保留扩展,那么@RunWith只是一种可能性。Pers
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());
    }
}
@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));
    }

    };