尽早进行单元测试(UnitTest)是比较好的做法,极端的情况甚至强调“测试先行”。现在我们已经有了第一个model类和Form类,是时候开始写测试代码了。
Django支持python的单元测试(unit test)和文本测试(doc test),我们这里主要讨论单元测试的方式。这里不对单元测试的理论做过多的阐述,假设你已经熟悉了下列概念:test suite, test case, test/test action, test data, assert等等。
在单元测试方面,Django继承python的unittest.TestCase实现了自己的django.test.TestCase,编写测试用例通常从这里开始。测试代码通常位于app的tests.py文件中(也可以在models.py中编写,但是我不建议这样做)。在Django生成的depotapp中,已经包含了这个文件,并且其中包含了一个测试用例的样例:
depot/depotapp/tests.py
你可以有几种方式运行单元测试:
python manage.py test:执行所有的测试用例
python manage.py test app_name, 执行该app的所有测试用例
python manage.py test app_name.case_name: 执行指定的测试用例
用第三中方式执行上面提供的样例,结果如下:
$ python manage.py test depotapp.SimpleTest
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.012s
OK
Destroying test database for alias 'default'...
你可能会主要到,输出信息中包括了创建和删除数据库的操作。为了避免测试数据造成的影响,测试过程会使用一个单独的数据库,关于如何指定测试数据库的细节,请查阅Django文档。在我们的例子中,由于使用sqlite数据库,Django将默认采用内存数据库来进行测试。
下面就让我们来编写测试用例。在《Agile Web Development with Rails 4th》中,7.2节,最终实现的ProductTest代码如下:
对Product测试的内容包括:
1.title,description,price,image_url不能为空;
2. price必须大于零;
3. image_url必须以jpg,png,jpg结尾,并且对大小写不敏感;
4. titile必须唯一;
让我们在Django中进行这些测试。由于ProductForm包含了模型校验和表单校验规则,使用ProductForm可以很容易的实现上述测试:
depot/depotapp/tests.py
然后运行 python manage.py test depotapp.ProductTest。如同预想的那样,测试没有通过:
Creating test database for alias 'default'...
.F..
======================================================================
FAIL: test_imgae_url_endwiths (depot.depotapp.tests.ProductTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/holbrook/Documents/Dropbox/depot/../depot/depotapp/tests.py", line 65, in test_imgae_url_endwiths
self.assertTrue(f.is_valid(),msg='error when image_url endwith '+endwith)
AssertionError: False is not True : error when image_url endwith FRED.JPG
----------------------------------------------------------------------
Ran 4 tests in 0.055s
FAILED (failures=1)
Destroying test database for alias 'default'...
因为我们之前并没有考虑到image_url的图片扩展名可能会大写。修改ProductForm的相关部分如下:
然后再运行测试:
$ python manage.py test depotapp.ProductTest
Creating test database for alias 'default'...
....
----------------------------------------------------------------------
Ran 4 tests in 0.060s
OK
Destroying test database for alias 'default'...
测试通过,并且通过单元测试,我们发现并解决了一个bug。
分享到:
相关推荐
Python Django Web典型模块开发实战_用Django设计大型电商的类别表_编程项目案例实例详解课程教程.pdf
Django for Beginners: Build ...Chapter 10:Bootstrap Chapter 11:Password Change and Reset Chapter 12:Email Chapter 13:Newspaper app Chapter 14:Permissions and Authorization Chapter 15:Comments Conclusion
本文包含:Django框架基础知识、Django视图和模板、Django框架和模型和django框架后台、Django框架实战:开发企业官网、Rest Framework 、Vue前端、Vue+Django综合项目;Vue前端对接:通过Vue与后端API进行数据交互...
Chapter 10: Best Practices for Class-Based Views Chapter 11: Form Fundamentals Chapter 12: Common Patterns for Forms Chapter 13: Templates: Best Practices Chapter 14: Template Tags and Filters Chapter...
Python Django Web典型模块开发实战_分析吾爱破解论坛反爬虫机制_编程项目案例实例详解课程教程.pdf
Django项目代码:爬取并展示链家上海二手房信息
Django实战
Python基于Django的实战项目源码——美多商城 Python基于Django的实战项目源码——美多商城 Python基于Django的实战项目源码——美多商城 Python基于Django的实战项目源码——美多商城 Python基于Django的...
给大家分享一套课程——Django+Vue:Python Web全栈开发(基于Django4.1),已完结10章,附源码。
实战Django:Pastebin源代码.7z
《Django实战》源码(第一、第二版)源码,亲测可正常运行
Django博客使用Django制作博客
docker-jenkins-django-tutorial:实战Docker + Jenkins + Django + Postgres:memo:
django-material:Django的材质设计
Django 的测试守护程序。 基于 将尝试找到进行更改的应用程序并仅为该应用程序运行测试。 如果找不到它或影响整个项目的更改,则将运行所有测试。 它不会注意到来自其他应用程序的测试使用已更改的应用程序。 即...
Python Django Web典型模块开发实战_区块链时代与Token登录_编程项目案例实例详解课程教程.pdf
项目标题:基于Python Django的实战项目源码解析 技术栈:本项目主要采用Python语言开发,辅以HTML和CSS进行前端设计。 文件概览:总计174个文件,包括以下类型: - pyc文件(已编译的Python文件):50个 - py文件...
Django企业开发实战.源码
这是我上知了课堂的Django笔记,包含了完整的项目部署过程。请注意:并不包含课堂的视频资料。
Django测试 Django测试的测试实用程序