unittest学习

2020-02-22  本文已影响0人  瘦不下去了

一、什么是单元测试&单元测试的对象

1.定义:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作
2.单元测试中最核心的四个概念:test case(测试用例),test suite(测试套件),test runner(测试运行器),test fixture(测试环境数据准备和数据清理或者测试脚手架)
 1)test case:一个testcase的实例就是一个测试用例。测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)
 2)TestSuite:多个测试用例集合在一起。
 3)TestLoader:用来加载Testcase到TestSuite中。
 4)TextTestRunner:用来执行测试用例,其中run(test)会执行TestSuite/TestCase中的run(result)方法。
 5)test fixture:测试用例环境的搭建和销毁

image.png
综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

二、初级使用

1.步骤

 1)导入unittest模块,被测文件或者其中的类
 2)创建一个测试类,被继承unittest.TestCase
 3)重写setUp和tearDown方法(如果有初始化条件和结束条件)
 4)定义测试函数,函数名以test_开头
 5)在函数体中使用断言来判断测试结果是否符合预期结果
 6)调用unittset.main()方法运行测试用例--------无此方法也是可以运行

2.使用setUp和tearDown方法,每次执行测试用例都会执行初始化化条件和结束条件

image.png

由代码看到,每次执行用例前都会执行初始化条件和结束条件,两个测试用例,共执行了两次初始化条件和结束条件。

3.设置setupClass和teardownClass:执行所有测试用例,仅执行一次初始化条件和结束条件

image.png

4.断言Assert----结果对比的函数

Method Checks that
assertEqual(a,b):相等 a==b
assertNotEqual(a,b) a!=b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a,b) a is b 判断是否是同一现象
assertIsNot(a,b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a,b):a是否在b中 a in b
assertNotIn(a,b) a not in b
assertIsInstance(a,b):实例对象 isInstance(a,b)
assertNotIsInstance(a,b) not isInstance(a,b)

设置断言,当某条测试用例执行失败,不会影响其他测试用例的执行


image.png image.png

也可以直接用 ==,!=,<=,>=来判断


image.png

写一个方法,通过unittest来执行


image.png
image.png

三、进阶使用

1.TestSuite:

 addTest():添加单个测试用例
 addTests([,,]):添加多个测试用例


image.png

2.addTest的参数:是一个测试用例的列表

 1. 方式一:类名(‘方法名’)的集合
 2.方式二:unittest.TestLoader.discover方法匹配目录下的用例-----用的最多的,测试用例在一个目录下
discover方法中默认匹配模式是从当前目录下找以test开头的py文件。测试用例的顺序执行是根据字母a-z,0-9的顺序执行的。
 3.方式三:unittest.TestLoader.loadTestsFromModule匹配模块中的测试用例
PS:TestLoader类、TestSuite类、TestRunner类需要先实例化再使用

如下是一个单元测试的实例


image.png
#实例:采用unittest.TestLoader.discover方式加载测试用例。
######定义函数:Myclass_test.py
class Myclass_Test():

    def __init__(self,a,b):
        self.a = a
        self.b = b

    def sum(self):
        sum = self.a + self.b
        return sum

    def sub(self):
        sub = self.a - self.b
        return sub

######定义测试类1:test_Myclass1.py
import unittest
from my_Unittest import Myclass_test

class Test_myclass(unittest.TestCase):

    def setUp(self):
        self.myclass = Myclass_test.Myclass_Test(11,10)

    def test_sum(self):
        sum = self.myclass.sum()
        print('class1sum = '+str(sum))
        self.assertEqual(21,sum)

    def test_sub(self):
        sub = self.myclass.sub()
        print('class1sub = '+str(sub))
        self.assertNotEqual(10,sub)

######定义测试类2:test_Myclass2.py
import unittest
from my_Unittest import Myclass_test

class Test_myclass(unittest.TestCase):

    def setUp(self):
        self.myclass = Myclass_test.Myclass_Test(1,10)

    def test_sum(self):
        sum = self.myclass.sum()
        print('class2sum = '+str(sum))
        self.assertEqual(11,sum)

    def test_sub(self):
        sub = self.myclass.sub()
        print('class2sub = '+str(sub))
        self.assertNotEqual(10,sub)

######主函数的调用:Myclass_main.py
import unittest
import os

#实例化测试套件对象
s = unittest.TestSuite()
#实例化TestLoader的对象
loader = unittest.TestLoader()
#使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
run = unittest.TextTestRunner()
run.run(s)

3.测试报告的生成

第一种:text文件----写到txt文件中

#第一种:unittest自带的方法
#创建一个文件,以写的方式打开

import unittest
import os

#实例化测试套件对象
s = unittest.TestSuite()
#实例化TestLoader的对象
loader = unittest.TestLoader()
#使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
fs  = open('test_run_report.txt','w')
run = unittest.TextTestRunner(fs)
run.run(s)

第二种:html测试报告
需下载HTMLTestRunner.py文件,http://tungwaiyip.info/software/HTMLTestRunner.html
下载后放到Python安装目录的Lib目录下即可。同时需修改文件中部分内容,附上链接:https://www.cnblogs.com/hellomaster/p/11040277.html

image.png
HTMLTestRunner参数详解:
verbosity
=1的时候 默认值为1,不限制完整结果,即单个用例成功输出’.’,失败输出’F’,错误输出’E’
=0的时候。不输出信息
=2的时候,需要打印详细的返回信息
--stream:测试报告写入文件的存储区域
--title:测试报告的主题
--description:测试报告的描述
import os
from HTMLTestRunner import *

#  实例化测试套件对象
s = unittest.TestSuite()
#  实例化TestLoader的对象
loader = unittest.TestLoader()
#  使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
with open(os.getcwd() +"/test_report.html","wb") as fp:
    runner = HTMLTestRunner(
        stream=fp,
        verbosity=1,
        title="测试报告标题",
        description="测试报告描述信息",
    )
    runner.run(s)


HTMLTestRunner踩坑记录:
1、导入的时候,尽量写成from HTMLTestRunner import *,如果是import HTMLTestRunner,那么下面调用的时候,要写成HTMLTestRunner.HTMLTestRunner

image.png
https://www.cnblogs.com/hellomaster/p/11040277.html

2、使用with open写入文件的时候,runner.run要放在with open里面
https://www.cnblogs.com/chuiyuedefeng/p/11902018.html

3、因为写入的是二进制文件,所以写入方式要用wb,使用w会报错
https://blog.csdn.net/kingyuan666/article/details/81214954

上一篇下一篇

猜你喜欢

热点阅读