我编写了一个脚本,它可以打开一个文件、读取内容并进行一些操作和计算,并将它们存储在集合和字典中。
我将如何为这样的事情编写单元测试?我的问题具体是:
- 我会测试文件是否打开?
- 该文件很大(它是 unix 字典文件)。我将如何对计算进行单元测试?我真的必须手动计算所有内容并测试结果是否正确吗?我有一种感觉,这违背了单元测试的全部目的。我没有通过标准输入接受任何输入。
我编写了一个脚本,它可以打开一个文件、读取内容并进行一些操作和计算,并将它们存储在集合和字典中。
我将如何为这样的事情编写单元测试?我的问题具体是:
这不是单元测试的意义所在!
单元测试意味着(不完整,也不是书本定义):
这个人(Gary Bernhardt)有一些有趣的实际例子来说明测试和单元测试的含义。
更新一些澄清:
“1. 我会测试文件是否打开了吗?”
好吧,您可以这样做,但是“单位”是什么?请记住,测试只有两种解决方案:通过和失败。如果您的测试失败,它应该(理想情况下必须)只有一个原因:您的单元(=函数)很烂!但是在这种情况下,您的测试可能会失败,因为: * 文件不存在 * 已锁定 * 已损坏 * 没有文件句柄 * 内存不足(大文件) * 月相等等。
那么失败(或通过)“单元”测试对您的单元有何影响?您不会单独测试您的单元,而是测试整个周围的环境。这更像是一个系统测试!如果您想测试是否成功打开文件,您至少应该模拟一个文件。
“2 ...我将如何对计算进行单元测试?我真的必须手动计算所有内容并测试结果是否正确吗?”
不。您将为极端情况和常规情况编写测试,并根据已处理的情况检查预期结果。所需测试的数量取决于计算的复杂性和规则的例外情况。
例如:
def test_negative_factor(self):
assert result
def test_discontinuity(self):
assert raise exception if x == undefined_value
我希望我让自己更清楚!
您应该将代码重构为可单元测试。那,在我的头顶上,会说:
您还没有解释计算是什么,但我想您的程序也应该能够处理大文件的一个子集。如果是这种情况,请进行单元测试,打开一个小文件,进行计算并产生一些结果,您可以验证它是正确的。