我们是否应该在编写单元测试的时候着眼于DRY,因为功能的变化会影响尽可能少的代码,我们的可预测性,即代码的操作是微不足道的。基本上我问的是在创建非常一般的帮助程序方法和多个单元测试可以使用的帮助程序方法之间的权衡,而不是将测试代码限制在单个单元测试中。作为一个实例采取工厂,具有以下方法签名的情况下:单元测试:干与可预测性
public Node buildNode(String path, String name, Map<String, Object> attributes);
根据参数提供所得节点对象将是不同的,因此,我们需要测试的不同的可能性。如果我们的目标是可预见性在第一个例子给我们可能会写两个独立的单元测试,但如果我们的目标是干我们宁愿加一个共同的辅助方法,如第二个例子:
EXAMPLE1:
@Test
public void testBuildBasicNode() {
Node node = testee.buildNode("/home/user", "Node", null);
assertEquals("/home/user/Node", node.getAbsolutePath());
assertEquals(false, node.isFolder());
}
@Test
public void testBuildAdvancedNode() {
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put("type", NodeType.FOLDER);
Node node = testee.buildNode("/home/user", "Node", attributes);
assertEquals("/home/user/Node", node.getAbsolutePath());
assertEquals(true, node.isFolder());
}
EXAMPLE2:
@Test
public void testBuildBasicNode() {
Node node = testee.buildNode("/home/user", "Node", null);
Node comparisonNode = buildComparisonNode("/home/user", "Node", null);
assertEquals(comparisonNode, node);
}
@Test
public void testBuildAdvancedNode() {
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put("type", NodeType.FOLDER);
Node node = testee.buildNode("/home/user", "Node", attributes);
Node comparisonNode = buildComparisonNode("/home/user", "Node", attributes);
assertEquals(comparisonNode, node);
}
private Node buildComparisonNode(String path, String name, Map<String, Object> attributes) {
// Not just a duplicate of the buildNode method,
// can be more trivial if we only limit it to unit tests that share some common attributes
...
}
我对第一个例子(可预测性)的问题是,如果任何功能改变(比如说说如何格式化AbsolutePath),它需要在所有单元测试中进行更改。我对第二个例子的问题是,buildComparisonNode感觉像是应该测试的东西,我当然不想开始编写测试测试。
另外,作为一个结束思想,您是否会声明在示例单元测试中使用的字面值字符串的最终变量,还是它们很好?
一个单位案例=一个测试。我没有看到DRY =) – mauris 2009-10-28 06:05:17