我們是否應該在編寫單元測試的時候着眼於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