编写单元测试代码应该遵循一些原则。?
1、单元测试的代码质量
应重视单元测试的代码质量,单元测试的代码质量和产品代码的质量同样重要。
2、单元测试的命名
单元测试类的名称命名模板:<被测试类名>Test。例如 SinglyLinkedList 类的单元测试类可以命名为:SinglyLinkedListTest。
测试具体功能的函数可以有两种命名方式:
- 使用模板:<测试前的状态>_<测试过程>_<测试预期结果>。例如:要编写一个函数测试:向一个空链表中添加一个元素,函数名称可以为:listIsEmpty_addOneElement_sizeIsOne()。
- 在函数名称中体现特点的需求。例如:要编写一个函数测试:链表中的元素个数不能大于一个特定的值,函数名称可以为:listSizeDontNotAllowMoreThanMAX()
以下两个例子的代码,都会测试失败。
例1:
template <typename T>
int SinglyLinkedList<T>::size()
{
int size{1};
if(header)
{
linkeNode<T> * thisNode = header;
while (thisNode)
{
++size;
if(!thisNode->next)
{
break;
}
thisNode = thisNode->next;
}
}
return size;
}
#include <QtTest>
#include "singlyLinkedList.h"
class SinglyLinkedListTest : public QObject
{
Q_OBJECT
private slots:
void listIsEmpty_addOneElement_sizeIsOne();
};
void SinglyLinkedListTest::listIsEmpty_addOneElement_sizeIsOne()
{
SinglyLinkedList<int> list;
list.append(123);
QCOMPARE(list.size(),1);
}
QTEST_APPLESS_MAIN(SinglyLinkedListTest)
#include "tst_singlylinkedlisttest.moc"
例2:
#include <QtTest>
#include "singlyLinkedList.h"
class SinglyLinkedListTest : public QObject
{
Q_OBJECT
private slots:
void listSizeDontNotAllowMoreThanMAX();
};
const int MAX = 3;
void SinglyLinkedListTest::listSizeDontNotAllowMoreThanMAX()
{
SinglyLinkedList<int> list;
list.append(123);
list.append(234);
list.append(345);
list.append(456);
QVERIFY(list.size() <= MAX);
}
QTEST_APPLESS_MAIN(SinglyLinkedListTest)
#include "tst_singlylinkedlisttest.moc"
从函数名称就能看出问题,非常直观。
3、单元测试的独立性
每个单元测试和其他单元测试应相互独立,即一个单元测试的执行不能依赖于前一个单元测试的执行结果。如果违背了这个原则那么单元测试会很难进行。
4、一个测试函数只测试一个功能(断言一次)
这个原则的意义有两个:
- 当测试失败时能很快速地找到问题的所在。
- 测试多个功能的函数不太好命名且让人疑惑,不禁思考这几个功能之间有什么关系?
5、不要对?getters 和 setters 进行单元测试
这种函数一般比较简单很难出错。
6、不要对第三方库做单元测试
使用时应假定第三方库没有问题。
7、不要把测试代码和产品代码混在一起
即不要再产品代码里面包含测试相关的内容。例如一个类里面包含测试这个类的某些功能的函数。
|