Django中的单元测试以及Python单元测试

Python单元测试

  是用来对一个模块、一个函数或者一个类进行正确性检验的测试工作。

  在Python中unittest是它内置的单元测试框架,单元测试与功能测试都是日常开发中必不可少的部分。

  比如对函数abs(),我们可以编写出一下几个测试用例:

  •  输入正数,比如1,1.2,0.99,我们期待返回值与输入相同
  •  输入负数,比如-1,-1.2,-0.99,我们期待返回值与输入值相反
  •  输入0,我们期待返回0
  •  输入非数值类型,比如None,[],{},我们期待抛出TypeError

    把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。

一个简单的测试用例

  定义一个类,简单的实现add、sub两方法,并对其进行单元测试

  待测试文件m1.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4
 5 class MyClass(object):
 6     def __init__(self, x, y):
 7         self.x = int(x)
 8         self.y = int(y)
 9
10     def add(self):
11         return self.x + self.y
12
13     def sub(self):
14         return self.x - self.y

  在m1.py同级目录下创建test.py测试文件,使用unittest单元测试框架对MyClass的方法进行测试

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4 import unittest
 5 from m1 import MyClass
 6
 7
 8 class MyclassTest(unittest.TestCase):
 9     def setUp(self):
10         self.calc = MyClass(7, 5)
11
12     def tearDown(self):
13         pass
14
15     def test_add(self):
16         ret = self.calc.add()
17         self.assertEqual(ret, 12)
18
19     def test_sub(self):
20         ret = self.calc.sub()
21         self.assertEqual(ret, 2)
22
23
24 # if __name__ == ‘__main__‘:
25 #     suite = unittest.TestSuite()
26 #     suite.addTest(MyclassTest(‘test_add‘))
27 #     suite.addTest(MyclassTest(‘test_sub‘))
28 #
29 #     runner = unittest.TextTestRunner()
30 #     runner.run(suite)
31
32 if __name__ == ‘__main__‘:
33     unittest.main()

运行测试

1 python -m unittest test
2 ..
3 ----------------------------------------------------------------------
4 Ran 2 tests in 0.000s
5
6 OK

总结:

  编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承,unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEqual()方法

运行单元测试: 

1 一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是在test.py的最后加上两行代码:
2 if __name__ == ‘__main__‘:
3     unittest.main()
4 这样就可以把test.py当做正常的python脚本运行:
5 $ python test.py
6 另一种方法是在命令行通过参数-m unittest直接运行单元测试:
7 $ python -m unittest test

 unittest框架小知识点梳理

  1. test fixture:是初始化和清理测试数据及环境,通过重写TestCase的setUp()和tearDown()方法实现

    两方法使用:设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:    

1 class MyclassTest(unittest.TestCase):
2
3     def setUp(self):
4         print(‘setUp...‘)
5
6     def tearDown(self):
7         print(‘tearDown...‘)

  2.test case:是测试用例

  3.test suite:是测试用例的集合,通过addTest加载TestCase到TestSuite中,返回一个TestSuite实例

  4.test runner:是运行测试用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suite或test case  

 注意:

  单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug

Django中的单元测试

  在创建app的时候,在app目录下自动生成tests.py文件

  Model部分单元测试用例  

1 from django.db import models
2
3 # Create your models here.
4
5
6 class Book(models.Model):
7     title = models.CharField(max_length=32)
8     price = models.DecimalField(max_digits=10, decimal_places=2)

  测试用例代码  

 1 from django.test import TestCase
 2 from app01.models import Book
 3 # Create your tests here.
 4
 5
 6 class BookModelTest(TestCase):
 7     def setUp(self):
 8         Book.objects.create(title=‘斗破苍穹‘, price=10.99)
 9
10     def test_book_model(self):
11         from decimal import Decimal
12         result = Book.objects.get(title=‘斗破苍穹‘)
13         self.assertEqual(result.price, Decimal(‘10.99‘))

运行测试在项目目录下运行:

1 python manage.py test
2 Creating test database for alias ‘default‘...
3 System check identified no issues (0 silenced).
4 .
5 ----------------------------------------------------------------------
6 Ran 1 test in 0.002s
7
8 OK
9 Destroying test database for alias ‘default‘...

视图部分单元测试用例  

1 from django.shortcuts import render
2
3 # Create your views here.
4
5
6 def index(request):
7     return render(request, ‘index.html‘) 

 在app01/tests.py文件中添加测试用例代码:

1 class IndexPageTest(TestCase):
2     """测试index页面"""
3     def test_index_page_renders_index_template(self):
4         """测试index视图"""
5         response = self.client.get(‘/index/‘)
6         self.assertEqual(response.status_code, 200)  # 判断状态码
7         self.assertTemplateUsed(response, ‘index.html‘)  # 判断渲染的模板是否正确

运行单元测试:

1 python manage.py test
2 Creating test database for alias ‘default‘...
3 System check identified no issues (0 silenced).
4 ..
5 ----------------------------------------------------------------------
6 Ran 2 tests in 0.044s
7
8 OK
9 Destroying test database for alias ‘default‘...

原文地址:https://www.cnblogs.com/Alexephor/p/11493491.html

时间: 2024-10-03 22:40:18

Django中的单元测试以及Python单元测试的相关文章

Python 单元测试 & 文档测试

1.1   单元测试 1.1.1   单元测试编写 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 编写一个Dict类,这个类的行为和dict一致,但是通过属性来访问. >>> d = Dict(a=1, b=2) >>> d['a'] 1 >>> d.a 1 class dict编写如下: [[email protected] python]# cat mydict.py #!/usr/bin/python # -*- co

[python] python单元测试经验总结

python写单元大多数都会用到unittest和mock,测试代码覆盖率都会用到coverage,最后再用nose把所有的东西都串起来,这样每次出版本,都能把整个项目的单元测试都运行一遍. Unittest unittest就不详细介绍了,注意几点: 测试类继承unittest.TestCase 测试类.测试方法名字最好以test开头,很多工具能根据名字来自动运行,很方便 测试类里面的setUp/tearDown会在每个case执行之前/之后执行,setUpClass/tearDownClas

Python单元测试PyUnit框架轻度整改

原理 参考:单元测试原理 背景 年后有段时间没写代码了,所以趁着周末找了个python单元测试玩下,测试自己的Android应用.发现PyUnit虽然在单个脚本文件中添加多个测试用例,比如官网提供的方法:官网地址 import unittest class WidgetTestCase(unittest.TestCase): def setUp(self): self.widget = Widget("The widget") def tearDown(self): self.widg

Python单元测试框架 unittest

Python单元测试框架 作者: Steve Purcell, <stephen_purcell at yahoo dot com>翻译: Heiz, <heiz dot yuan at gmail dot com>项目网站: http://pyunit.sourceforge.net/ 目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代

Python单元测试--使用装饰器实现测试跳过和预期故障

Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev/library/unittest.html The following decorators implement test skipping and expected failures: #以下装饰器实施测试跳过和预期故障: @unittest.skip(原因) Unconditionally s

Python 单元测试框架 —— PyUnit

转载自http://www.oschina.net/question/12_27127#GUI 目录 概况 系统要求 使用PyUnit构建自己的测试   安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的放置位置 交互式运行测试 从命令行运行测试 在用户界面窗口运行测试 为测试编写文档 更多关于测试条件 测试相等性 测试异常 通过PyUnit复用旧测试代码 在JPython和Jython中使用PyUn

Python单元测试框架unittest之深入学习

前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图(下面的类图以及解释均来源于网络,原文链接): 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程,包括测

django 中的延迟加载技术,python中的lazy技术

---恢复内容开始--- 说起lazy_object,首先想到的是django orm中的query_set.fn.Stream这两个类. query_set只在需要数据库中的数据的时候才 产生db hits.Stream对象只有在用到index时才会去一次次next. 例子: f = Stream() fib = f << [0, 1] << iters.map(add, f, iters.drop(1, f)) 1行生成了斐波那契数列. 说明: f是个lazy的对象,f首先放入

Python笔记(五)--Django中使用模板

使用Django开发网站时,如果不使用模板,那么将会很不合理.因为我们所有的html代码都需要被硬编码到我们的Python代码中.我们新建一个工程,然后再在新建一个应用程序,并在其中的views.py文件中添加如下代码: 1 #coding=UTF-8 2 from django.http.response import HttpResponse, Http404 3 import datetime 4 5 def hours_ahead(request,offset): 6 try: 7 of