django 的单元测试
指定测试范围:
指定运行某些测试文件./manage.py test --pattern="tests_*.py" -v 2
运行所有测试文件./manage.py test -v 2
- # Run all the tests in the animals.tests module
- $ ./manage.py test animals.tests
- # Run all the tests found within the 'animals' package
- $ ./manage.py test animals
- # Run just one test case
- $ ./manage.py test animals.tests.AnimalTestCase
- # Run just one test method
- $ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak
临时数据库:
运行时会临时创建数据库, 运行结束后删除, 数据库名字: test_用到的数据库. 猜测是使用 migragtion 文件创建的
举例:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- @Author :
- @Date : 2019-01-02 22:48
- @Description : 本文件的作用描述
- @File : test_demo.py
- """
- from unittest.mock import patch
- from django.test import TestCase
- import os
- def multiple(a, b):
- return a * b
- class Calculator(object):
- def add(self, a, b):
- return a+b
- def is_error(self):
- try:
- os.mkdir("11")
- return False
- except Exception as e:
- return True
- def multiple(self, a, b):
- return a * b
- # Mock 一个函数.
- class TestOneFunc(TestCase):
- # 指定函数的写法: 要先写当前文件名, 即 module name
- @patch('test_demo.multiple')
- def test_multiple(self, mock_multiple):
- mock_multiple.return_value = 3
- self.assertEqual(multiple(8, 14), 3)
- class TestProducer(TestCase):
- def setUp(self):
- self.calculator = Calculator()
- # Mock 的函数每次被调用返回不同的值
- @patch.object(Calculator, 'add')
- def test_effect(self, mock_add):
- # 注意 list 的顺序要和后面的顺序一一对应
- mock_add.side_effect = [1, 2, 3]
- self.assertEqual(self.calculator.add(8, 14), 1)
- self.assertEqual(self.calculator.add(8, 14), 2)
- self.assertEqual(self.calculator.add(8, 14), 3)
- # Mock 一个对象里面的方法
- @patch.object(Calculator, 'add')
- def test_add1(self, mock_add1):
- # 模拟 add 函数的返回值为 3, 所以不管真实结果是否是 3, 都没有影响
- mock_add1.return_value = 3
- self.assertEqual(self.calculator.add(8, 14), 3)
- # 让 Mock 的函数抛出 exception
- @patch('os.mkdir')
- def test_exception(self, mock_mkdir):
- mock_mkdir.side_effect = Exception
- self.assertEqual(self.calculator.is_error(), True)
- # Mock 多个函数, 主要是注意顺序
- @patch.object(Calculator, 'add')
- @patch.object(Calculator, 'multiple')
- def test_both(self, mock_multiple, mock_add):
- mock_add.return_value = 1
- mock_multiple.return_value = 2
- self.assertEqual(self.calculator.add(8, 14), 1)
- self.assertEqual(self.calculator.multiple(8, 14), 2)
- class ClassTemplate(object):
- def __init__(self, name):
- # __name c 是私有变量, 只有类本身可以访问, 子类也不可以访问
- # _name 是受保护变量, 类本身和子类可以访问, from module import * 无法导入
- # decorator / 迭代器 / yield/
- self.__name = name
- def run(self):
- print("my name is %s" % self.__name)
- @staticmethod
- def staticmethod(value):
- print("my value is {}".format(value))
- if __name__ == '__main__':
- ClassTemplate('a_name').run()
- ClassTemplate.staticmethod('a_value')
参考:
- ,https://www.jianshu.com/p/b87d7b4a222a
- ,https://segmentfault.com/a/1190000002965620
- ,https://docs.python.org/3.7/library/unittest.mock.html
- ,https://docs.djangoproject.com/zh-hans/2.1/topics/testing/overview/
来源: http://www.bubuko.com/infodetail-2906915.html