我发现为算法编写单元测试很容易。例如,sort(List)
,很容易编写如下测试:
list = [2, 1, 4];
assert(sort(list) == [1, 2, 4]);
但我发现很难测试没有逻辑的方法,没有if
语句,只有一组调用。
我主要有2个例子可以解答如何对它们进行单元测试:
示例1:
假设我有一个负责将一些数据写入文件的类,但该数据是由外部函数(writeHeaderToFile
,writeSerializedData
和{以特定方式编写的。 {1}})。
数据不是直接写入文件,因此如果数据类似于:
writeEndOfFile
这并不意味着该文件既不是该数据的普通版本(没有空格),也不是简单的序列化版本或加密版本到文件中。实际的文件二进制文件将是我不知道的东西。我所知道的是,我可以使用这3种方法以正确的方式书写。
此文件还包含一些其他信息,这些信息并非直接来自这3种方法,例如特定类型的标题(同样,我不知道它将如何在文件二进制文件中表示)。
这是班级:
{
list: [
"item 1",
"item 2"
],
name: "aaa"
}
示例2:
class FileCreator {
populateFileWithData(File file, Data data) {
doBlockWithLock(file, {
Header header;
header.format = SomeFormat;
header.version = SomeVersion;
writeHeaderToFile(file, header);
writeSerializedData(file, data);
writeEndOfFile(file);
});
}
// Private
void doBlockWithLock(File file, Lambda block) {
file.holdWritingLock();
block();
file.releaseWritingLock();
}
}
对于这个我可以做这样的事情:
class Controller {
var screenOne = new ScreenOne();
var screenTwo = new ScreenTwo();
var screenThree = new ScreenThree();
void reloadButtonWasClicked() {
screenOne.reload();
screenTwo.reload();
screenThree.reload();
}
}
但我不会发现它有多大价值,因为我只是断言我做的是我在实施中所做的同样的事情。好像代码重复给我。
测试我的两个例子的正确方法是什么?
答案 0 :(得分:0)
在第一个示例中,如果您编写了有问题的消息并对测试覆盖率感到满意,则没有理由在FileCreator上重现该测试逻辑。您只需要测试FileCreator populateFileWithData方法以确保写入文件,并且锁定机制可能正常工作。
你是对的,你的最后一次测试是相当微不足道的。我很想省略写作。但这取决于。是否有人可能会出现并评论其中一个面板构造函数?你有其他测试可以识别这样的问题吗?