特别是我担心这种情况: 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实例的引用来获得成绩.