java - 我的单元测试是否违反了 "test should do one thing principle"?

标签 java unit-testing tdd

我在类里面编写了一些单元测试,最后我很困惑是否要合并这些测试,因为它们的失败原因是相同的。

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/

相关文章:

java - 在映射器中运行 hdfs -text 命令并使用输出

android - 将解析信息添加到 Robolectric 包管理器

laravel - 如何测试 Laravel 资源

unit-testing - QT:获取对象的类名

c# - 如何从 TestCleanup 方法中获取测试名称?

java - 如何为基于字符串条件从数组中过滤元素的方法编写测试

c# - 断言比较两个对象列表 C#

java - 在 OS X 中从扩展坞隐藏 install4j 生成的服务

Java 等待多个线程,这可能会创建新线程

java - 如何将标签和文本左对齐