Java中的测试驱动开发 - 如何声明变量以及如何生成某些代码

时间:2014-10-28 22:13:40

标签: java tdd

我是TDD的新手,我很困惑!

我的第一个问题是测试如何导致使用您想要的名称声明变量?

例如,如果我的测试中有一些代码,请说

public class someTest {
    @Test
    public void test(){
        new someMethod(1,0);
    }
}

那么,有没有办法在测试中命名变量?

我的第二个问题是,我是否希望该方法执行System.out.print(“Some error”),因为其中一个变量值,然后返回测试需要包含的内容?

我完全迷失了。所以任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:2)

暂时忘掉TDD吧。如果您先从界面或类开始,您会如何考虑测试?这就是我要做的事情:从我的班级开始。

public class Foo {
    private String message;

    public Foo(String m) { this.message = m; }
    public String getMessage() { return this.message; }
    public static int add(int x, int y) { return x*y; }
}

然后我为它写了一个JUnit测试:

public class FooTest {
    @Test
    public void testConstructor() { 
        String expected = "Hello";
        Foo f = new Foo(expected);
        Assert.assertEquals(expected, f.getMessage());
    }

    @Test
    public void testAdd() {
        int expected = 5;
        Assert.assertEquals(expected, Foo.add(2, 3));
    }
}

我运行此测试并立即发现我的添加实现存在问题。

那么TDD做什么?他们将事情发挥到极致:首先编写测试,然后编写课程。您尝试编译测试并且失败,因为您没有编写该类。一旦有了类实现,就可以为每个方法维护一个紧密的代码测试循环,保持100%的传递和良好的覆盖率,包括快乐路径,错误条件和边缘情况。

TDD并不意味着你不知道你要编写和测试的课程。在开始之前,您应该了解所需的API。

就我个人而言,我认为要求你在课前愚蠢之前编写测试。画出课程,在测试之前不要走得太远。写一个方法,测试它,写另一个。

顺便说一句:如果你在没有Assert的情况下编写JUnit测试,那么你做错了。不要写信给System.out。通过或不通过判断不应取决于您的目视检查;它应该自动断言和确定。

答案 1 :(得分:0)

您不应该关心正在创建的特定变量。如果您正确编写的测试描述了您想要的行为,并且您的实现可以按照您的意愿工作,那么为什么要关注它内部的变量?最终,您将被迫创建一些变量以满足后续测试之一。它的名称不应该被测试 - 这是实现细节,测试不应该依赖它。