Должны ли мы стремиться к СУХОЙ, в том смысле, что изменения в функциональности влияют как можно меньше кода, наша предсказуемость в том смысле, что операция кода тривиальна при написании модульных тестов? В основном я спрашиваю о компромиссе между созданием вспомогательных методов, которые являются очень общими, и которые могут использоваться несколькими модульными тестами по сравнению с тем, что только ограничивает тестовый код одним тестом. В качестве примера рассмотрим случай завода, который имеет следующий метод подпись:Единичные тесты: сухие против предсказуемости
public Node buildNode(String path, String name, Map<String, Object> attributes);
В зависимости от параметров при условии, что результирующий объект Узел будет отличаться, и поэтому мы должны проверить различные возможности. Если мы стремимся к предсказуемости мы могли бы написать два теста автономных единиц, как указано в первом примере, но если мы стремимся к DRY мы бы скорее добавить общий вспомогательный метод, например, как во втором примере:
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