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