当前位置 : 主页 > 手机开发 > 其它 >

单元测试 – 在TDD中,我如何确保测试本身不会过时(并错误地报告SUCCESS)?

来源:互联网 收集:自由互联 发布时间:2021-06-22
特别是我担心这种情况: 1)我写了一个包含1个成员变量和一个复制函数的类 class MyClass{private:int grade;public:void setGrade(int x) { grade = x; }int getGrade() { return grade; }void copyFrom(const MyClass* src)
特别是我担心这种情况:

1)我写了一个包含1个成员变量和一个复制函数的类

class MyClass
{
private:
int grade;

public:
void setGrade(int x) { grade = x; }
int getGrade() { return grade; }
void copyFrom(const MyClass* src) { grade = src->grade; }
}

2)沿着这些线写一个单元测试

void testCopyFrom()
{
MyClass mc1;
MyClass mc2;
mc1.setGrade(-347);
mc2.setGrade(10);
mc2.copyFrom(&mc1);
TS_ASSERT_EQUALS(mc2.getGrade(), -347);
}

3)几个月后,我添加了第二个成员变量

private:
int grade, extra;

并且,(你猜对了!)忘了相应地更新copyFrom()函数.

在这种情况下,单元测试将错误地报告成功.我在测试设计上做错了吗?

TDD意味着首先测试:在更改代码之前,您应该更新代码.在这种情况下,如果你决定添加额外的,你应该在额外添加API的测试(到目前为止你没有,但也许你会想要getExtra()等),然后,当你添加和修改测试时,您会注意到需要将setExtra()和getExtra()调用添加到testCopyFrom().

在这个阶段,你的测试大多会失败(红色),然后你可以做真正的代码使它们通过(绿色),最后,清理和重构,使用你的测试作为指导你是否已经破碎任何东西.

阅读更多关于red-green-refactor – 它是TDD.

另外,你应该将getGrade()标记为const,即

int getGrade() const { return grade; }

这意味着您可以使用const指针或MyClass实例的引用来获得成绩.

网友评论