Django学习系列19:完成最简单可用的网站——确保功能之间相互隔离

前面遗留的问题,首先时功能测试运行结束后的清理;其次是目前我们的待办清单只允许创建一个大家公用的清单。

如何隔离测试,运行功能测试后待办事项一直存在于数据库中,这会影响下一次测试。

运行单元测试时,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,以便访问保存的清单。

 

posted @ 2019-10-18 14:01  Ranxf  阅读(320)  评论(0编辑  收藏  举报