django的单元测试框架unittest

Posted shengulong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django的单元测试框架unittest相关的知识,希望对你有一定的参考价值。

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)

 

 

参考:

1、https://www.jianshu.com/p/b87d7b4a222a

2、https://segmentfault.com/a/1190000002965620

3、https://docs.python.org/3.7/library/unittest.mock.html

4、https://docs.djangoproject.com/zh-hans/2.1/topics/testing/overview/

 

以上是关于django的单元测试框架unittest的主要内容,如果未能解决你的问题,请参考以下文章

unittest单元测试框架

Python单元测试框架:unittest

单元测试框架unittest

十python_unittest

基于appium实现的线性代码引用unittest单元测试框架

Python 中 unittest 单元测试框架中需要知识点