TDD这一词很早就听过,Test Driven Development,之前更多的认知是停留在概念上的,很少实践、盲目实践,而且认为这就是一套方法论而已。由于之前项目时间紧张,再加上个人编程习惯的传统,TDD多次的擦身而过,最后停留在可望而不可及的层面了。
image.png
最近开始深入了解Python知识,买了一本《Python Web开发测试驱动方法》的书,由Harry J.W. Percival著,起初知识想着了解一下Python的测试知识有什么不同,没想到有幸真正认识了“测试山羊”,读了前言和前三章后终于茅塞顿开,TDD不只是一个理念,更是一个非常可操作的方法,并且从心理学上讲也能极大减少开发压力,从而写出让人赏心悦目的代码。废话不多说了,首先说点准备工作。
一、准备工作
Python环境,>3.3
HTML基础知识
JavaScript基础知识
Firefox或其他浏览器,建议Firefox
Git,一定要有版本管理
Selenium,最新版本
Django
小Tips:除非你确切的知道要做什么,否则不要使用virtualenv。
你需要一个脾气不好、不可理喻的师傅来强制你进行TDD,我们的师傅就是“测试山羊”,一次只迈一步。
二、TDD步骤:
TDD不是天生就会的技能,需要像武术一样反复练习,一旦掌握熟练后,它的驱动真的很快很快。
编写测试。第一步始终一样
编写应用代码。只有测试失败了才能进行第二步
Git提交。每次改动都要进行提交,并写提交消息
编写测试首先编写一个用户故事
精简注释。只要努力做到代码可读,使用有意义的变量名和函数名,保持代码结构清晰,就不需要通过注释说明代码做了什么,只是偶尔写点注释说明为什么这么做。否则就会形成注释谎言。
预期失败。对于意料之中的失败其实是好消息,只需等待失败的出现,并在出现有编写应用代码。
重来一遍,换个说法(原书):
先写功能测试,从用户角度描述应用的新功能
功能测试失败后,想办法写代码让它通过(或者说至少让当前失败的测试通过)。此时使用一个或多个单元测试定义希望代码实现的效果,保证为应用中的每一行代码(至少)编写一个单元测试。
单元测试失败后,编写最少量的应用代码,刚好让单元测试通过。有时要在第2步和第3步之间多次往复,直到我们觉得功能测试有一点进展为止。
再次运行功能测试,看能否通过,或者有没有进展。这一步可以促使我们编写一些新的单元测试和代码等。
三、相关知识点:
功能测试脚本
名称:functional_tests.py
执行:$ python functional_tests.py
创建Django项目
$ django-admin.py startproject firstDemo
启动Django项目
$ python manage.py runserver
创建Django应用
$ python manage.py startapp lists
运行Django单元测试
$ python manage.py test
TDD同时使用功能测试和单元测试
功能测试:站在用户的角度从外部测试应用。高层驱动。
单元测试:站在程序员的角度从内部测试应用。低层驱动。
“单元测试/编写代码”循环
(1)在终端里运行单元测试
(2)在编辑器中改动最少量的代码
(3)重复上两步
四、阅读报错报告
一定要花时间学习如何快速阅读错误报告,找出解决问题的线索。
首先查看错误本身。很多时候你只需查看这一处就能找出问题所在,不过有些时候原因就不那么明显。
接下来要确认哪个测试失败了。反问:是刚才写的预期失败的那个测试吗?
然后查看导致失败的测试代码。要从测试报告顶部往下看,找出错误发生在哪个测试文件中的哪个测试函数中的哪一行代码。
通常还有第四步,继续往下看,查找问题牵涉的应用代码。
五、用户故事参考
image.png
image.png
先到这里,后面章节阅读后、实践后再续。