Django中的单元测试以及Python单元测试
Python单元测试是用来对一个模块、一个函数或者一个类进行正确性检验的测试工作。 在Python中unittest是它内置的单元测试框架,单元测试与功能测试都是日常开发中必不可少的部分。 比如对函数abs(),我们可以编写出一下几个测试用例:
把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。 一个简单的测试用例定义一个类,简单的实现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‘... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |