原创翻译-测试驱动开发(TDD)

测试驱动开发原则 翻译自<<Expert Python Programming>>

测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件。也就是说,在编写软件之前先把这个软件的测试文档写清楚。举个例子,如果有个程序员想编写一个可以计算一组数字平均值的函数,那我们先要写出这个函数是怎么用的。我们可以这样写:
assert average(1, 2, 3) == 2
assert average(1, -3) == -1

这些测试例子也可以由别的人来负责编写。现在,这个函数如果通过了这两个测试那么就可以拿出去用了:
>>> def average(*numbers):
...    return sum(numbers) / len(numbers)
...
>>> assert average(1, 2, 3) == 2
>>> assert average(1, -3) == -1

但是我们新增的测试实例却发现了一个错误:
>>> assert average(0, 1) == 0.5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError

我们可以根据这个错误来对代码进行修改:
>>> def average(*numbers):
...    # makes sure all numbers can be used as floats
...    numbers = [float(number) for number in numbers]
...    return sum(numbers) / float(len(numbers))
...
>>> assert average(0, 1) == 0.5

并且我们还可增加更多的测试实例:
>>> try:
...    average()
...  except TypeError:
...    # we want an empty sequence to throw a type error
...    pass
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 3, in average
ZeroDivisionError: integer division or modulo by zero
>>>
>>> def average(*numbers):
...  if numbers == ():
...  raise TypeError((\'You need to provide at \'
...  \'least one number\'))
...  numbers = [float(number) for number in numbers]
...  return sum(numbers) / len(numbers)
...
>>> try:

...  average()
...  except TypeError:
... pass
...

这里我们可以编写一个测试函数,函数里面包含了我们要使用的所有测试,每次修改我们的代码后就可以运行着个函数:
>>> def test_average():
...  assert average(1, 2, 3) == 2
...  assert average(1, -3) == -1
...  assert average(0, 1) == 0.5
...  try:
...    average()
...  except TypeError:
...    pass
...
>>> test_average()

每次我们修改代码之后,我们也会相应的在test_average里面增加新的测试集。同时我们也要保证之前的测试集可以通过。最好的办法是我们把对应模块的所有测试集都放在一个文件夹下面,每个模块对应一个测试文件夹。驱动测试开发可以为我们带来这些好处:

防止代码回归

提高代码质量

提供最简便的文档

快速的创造健壮代码

 

防止代码回归

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzswxp.html