微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

特别是我担心这种情况:

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实例的引用来获得成绩.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐