使用 TestWatcher 记录测试用例中的断言失败
Using TestWatcher for logging assertion failures in test cases
Context/Scenario:
我正在使用 JUnit 和 Apache Log4J 来学习 TDD 和日志服务最佳实践。我有一个 GenericTaskInterpreter
class,它有一个方法 connectToMySQL
,它将尝试连接到一个 MySQL 数据库和 return 一个类型为 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;
}
}
我有一个 class 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 记录此测试用例场景中的断言失败?
- 有没有比使用 TestWatcher 更好的选择?
@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 会做得很好,就像你已经做过的那样。就个人而言,我会通过文件配置它而不使用根记录器,但这只是一个细节。
您可能希望在任何事件(设置、测试、清理 failure/pass/skip)发生时附加一个 common/discrete 结果文件。
如果您 运行 您的测试是并行的,您必须将日志写入同步到结果文件
为此,您可能需要覆盖 junit 的 RunListener 中的方法 API
http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html 共 class 个 RunListener
Context/Scenario:
我正在使用 JUnit 和 Apache Log4J 来学习 TDD 和日志服务最佳实践。我有一个 GenericTaskInterpreter
class,它有一个方法 connectToMySQL
,它将尝试连接到一个 MySQL 数据库和 return 一个类型为 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;
}
}
我有一个 class 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 记录此测试用例场景中的断言失败?
- 有没有比使用 TestWatcher 更好的选择?
@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 会做得很好,就像你已经做过的那样。就个人而言,我会通过文件配置它而不使用根记录器,但这只是一个细节。
您可能希望在任何事件(设置、测试、清理 failure/pass/skip)发生时附加一个 common/discrete 结果文件。
如果您 运行 您的测试是并行的,您必须将日志写入同步到结果文件
为此,您可能需要覆盖 junit 的 RunListener 中的方法 API
http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html 共 class 个 RunListener