zoukankan      html  css  js  c++  java
  • 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'...
  • 相关阅读:
    201521123053《Java程序设计》第十周学习总结
    201521123003《Java程序设计》第9周学习总结
    201521123053《Java程序设计》第八周学习总结

    201521123053《Java课程设计》第七周学习总结
    201521123053《Java设计与程序》第六周学习总结
    201521123053 《Java程序设计》第5周学习总结
    例子
    201521123053《Java程序设计》第四周总结
    201521123049 《JAVA程序设计》 第11周学习总结
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11493491.html
Copyright © 2011-2022 走看看