通常在代码中看到日志记录功能:
public class A {
private static final Log LOG = LogFactory.getLog(A.class);
Run Code Online (Sandbox Code Playgroud)
和用法:
} catch (Exception e) {
LOG.error(e.getMessage(), e);
throw e;
}
Run Code Online (Sandbox Code Playgroud)
但我从来没有看到过这种代码的单一单元测试.
当然我测试抛出异常和异常类型,但是我应该编写测试来检查日志记录信息吗?我倾向于认为日志记录是系统行为的另一部分,所以它在逻辑上退出以在测试中覆盖它.
假设我应该覆盖它,意味着我应该更改我的原始代码以注入模拟日志并检查是否使用预期消息调用了"error"方法.但是,如果我的原始类是service并且它是由spring实例化的,该怎么办?我应该注入一些记录器以及其他依赖项吗?
指数:
{
"settings": {
"index.percolator.map_unmapped_fields_as_text": true,
},
"mappings": {
"properties": {
"query": {
"type": "percolator"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此测试过滤器查询有效
{
"query": {
"match": {
"message": "blah"
}
}
}
Run Code Online (Sandbox Code Playgroud)
此查询不起作用
{
"query": {
"simple_query_string": {
"query": "bl*"
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
{"took":15,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":0.13076457,"hits":[{"_index":"my-index","_type":"_doc","_id":"1","_score":0.13076457,"_source":{"query":{"match":{"message":"blah"}}},"fields":{"_percolator_document_slot":[0]}}]}}
Run Code Online (Sandbox Code Playgroud)
为什么此simple_query_string查询与文档不匹配?
问:如何检测真实的测试覆盖率?
我注意到代码覆盖率指标和测试质量存在一个问题:100%的代码覆盖率并不意味着代码经过了真正的测试.
有时候测试会提供100%的覆盖率,即使它没有覆盖所有内容.问题在于覆盖范围定义,我们假设coverage ==可达代码.
但事实并非如此,代码可以100%可达,但不能100%覆盖测试.
看一下示例,此测试提供100%覆盖率(EMMA),但实际上它不包括将传递给服务模拟的值.因此,如果值将被更改,测试将不会失败.
例:
public class User {
public static final int INT_VALUE = 1;
public static final boolean BOOLEAN_VALUE = false;
public static final String STRING_VALUE = "";
private Service service;
public void setService(Service service) {
this.service = service;
}
public String userMethod() {
return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE);
}
}
Run Code Online (Sandbox Code Playgroud)
并测试它:
public class UserTest {
private User user;
private Service easyMockNiceMock;
@Before
public void setUp() throws Exception {
user = new User();
easyMockNiceMock = …Run Code Online (Sandbox Code Playgroud)