前面遗留的问题,首先时功能测试运行结束后的清理;其次是目前我们的待办清单只允许创建一个大家公用的清单。
如何隔离测试,运行功能测试后待办事项一直存在于数据库中,这会影响下一次测试。
运行单元测试时,Django的测试运行程序会自动创建一个全新的测试数据库(和应用真正使用的数据库不同)。
运行每个单元测试之前都会清空数据库,等所有测试都运行完之后,再删除这个数据库。
功能测试目前使用的时应用真正使用的数据库db.qlite3,在function_test.py中添加执行清理任务的代码,这样的任务最适合在setUp和tearDown方法中完成。
LiveServerTestCase 这个类会自动创建一个测试数据库(跟单元测试一样),并启动一个开发服务器,让功能测试在其中运行。
LiveServerTestCase必须使用manage.py,由Django的测试运行程序运行,测试运行程序查找所有名字以test开头的文件。
为保证文件结构清晰,要新建一个文件夹保存功能测试,让它看起来像一个应用。Django对这个文件夹的要求必须是有效的Python模块,即文件夹中要有一个__init__.py文件。
$ mkdir functional_tests $ touch functional_tests/__init__.py
要移动功能测试,把独立的function_test.py文件移到function_tests应用中并把他重命名tests.py。
使用git mv命令完成这个操作,让git知道文件移动了。
$ git mv functional_tests.py functional_tests/tests.py $ git status # shows the rename to functional_tests/tests.py and 新增了__init__.py
现在的目录结构
.
├── db.sqlite3
├── functional_tests
│ ├── __init__.py
│ └── tests.py
├── geckodriver.log
├── lists
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_item_text.py
│ │ ├── __init__.py
│ │ └── __pycache__
│ ├── models.py
│ ├── __pycache__
│ ├── templates
│ │ └── home.html
│ ├── tests.py
│ └── views.py
├── manage.py
└── subperlists
├── __init__.py
├── __pycache__
├── settings.py
├── urls.py
└── wsgi.py
现在运行功能测试不执行python function_tests.py命令,而是使用pythoon manage.py rest function_tests命令。
下面编辑functional_tests/tests.py
class NewVisitorTest(LiveServerTestCase): def setUp(self): # 1 self.browser = webdriver.Firefox() self.browser.implicitly_wait(3)
现在能使用Django的测试运行程序运行功能测试了,指明只运行function_tests应用中的测试
# python manage.py test functional_tests
功能测试和重构前一样,能运行到self.fail。如果再次运行测试,之前的测试不再遗留待办事项了。因为功能测试运行完之后把它们清理掉了。
提交小改动
git status # functional_tests.py renamed + modified, new __init__.py $ git add functional_tests $ git diff --staged -M $ git commit # msg eg "make functional_tests an app, use LiveServerTestCase"
现在,如果执行 python manage.py test命令,Django会运行功能测试和单元测试
如果向运行单元测试,可以指定只运行lists应用中的测试:python manage.py test lists
运行功能测试:python manage.py test functional_tests
另外考虑如何支持多个清单,一个用户不能查看另一个用户的清单,并且每个清单都有自己的URL,以便访问保存的清单。