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'...

猜你喜欢

转载自www.cnblogs.com/Alexephor/p/11493491.html