我在类里面编写了一些单元测试,最后我很困惑是否要合并这些测试,因为它们的失败原因是相同的。
PatternBuilder 类
public class PatternBuilder {
private static final String PATTERN_INITIALS = "#0.%s";
String buildPatternFromScale(int scale) {
return String.format(Locale.ENGLISH, PATTERN_INITIALS, StringUtils.repeat("0", scale));
}
}
上述实现的单元测试
@RunWith(Parameterized.class)
public class PatternBuilderTest {
private PatternBuilder patternBuilder;
@Parameterized.Parameter
public int scale;
@Parameterized.Parameter(1)
public String expectedPattern;
@Before
public void setUp() {
patternBuilder = new PatternBuilder();
}
@Parameterized.Parameters(name = "buildPatternFromScale({0}) = {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{1, "#0.0"},
{2, "#0.00"},
{5, "#0.00000"},
});
}
@Test
public void testShouldVerifyThatNonNullPatternIsBuilt() {
//given
//when
String pattern = patternBuilder.buildPatternFromScale(scale);
//then
assertThat(pattern, is(notNullValue()));
}
@Test
public void testShouldVerifyThatCorrectPatternOfSpecifiedScaleShouldBeCreated() {
//when
String pattern = patternBuilder.buildPatternFromScale(scale);
//then
assertThat(pattern, is(equalTo(expectedPattern)));
}
}
如果我将第一个测试与第二个测试结合起来,使其断言非空值和正确的模式字符串,我是否会违反“测试应该只做一件事”?
实际上,单个测试将具有以下两个断言 -
assertThat(pattern, is(notNullValue()));
assertThat(pattern, is(equalTo(expectedPattern)));
原因 - 我正在考虑将它们结合起来,因为如果创建空模式字符串,那么它将因一个原因而导致两个测试失败
最佳答案
Will I violate the 'test should do only one thing' if I combine first test with second such that it asserts for no-null-value and correct pattern string ?
在这种情况下我不认为。
为什么 ?
因为第一个测试方法:
assertThat(pattern, is(notNullValue()));
buildPatternFromScale()
方法的任何预期行为均无效。
此方法旨在根据收到的参数返回一个Pattern
。
唯一需要检查的是。
通过编写测试方法来执行非空断言,您不会覆盖该方法的规范。您只需编写第一步即可验证它。
如果您的方法在某些情况下可以返回 null
而在其他情况下则不返回 null
,那么它可能是有意义的。
但事实并非如此。
所以我会替换:
assertThat(pattern, is(notNullValue()));
assertThat(pattern, is(equalTo(expectedPattern)));
仅通过:
assertThat(pattern, is(equalTo(expectedPattern)));
关于java - 我的单元测试是否违反了 "test should do one thing principle"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45417528/