UnitTest框架

本文介绍了Python的UnitTest框架,包括其核心要素如TestCase、TestSuite、TestLoader和TestRunner的使用。详细阐述了如何编写测试用例,如何组织和运行测试,以及如何进行参数化测试和使用断言。此外,还提到了测试报告的生成和跳过功能,并提供了使用HTMLTestRunner生成第三方测试报告的示例。
摘要由CSDN通过智能技术生成

1. UnitTest框架的概念、核心要素、使用目的

    使用框架是需要按照框架的规定去填充代码
    UnitTest框架是Python自带的一个用来单元测试的框架

UnitTest
none
为了只写一遍相同的操作,比如·每一个用例都有一些共同的操作那么这些操作就可以写在Fixture里,多个用例都会调用这个且只有写一次该代码
TestSuite和TestLoader的功能一致且TestLoader更方便。

TestCase 测试用例的书写

这个测试用例相当于手工测试中写的测试用例的一个代码版对象
分为四步:导包(import unittest); 自定义测试类(需要继承unittese的TestCase类才能成为测试类) ; 在测试类中自定义测试方法; 运行代码(即执行测试用例)

"""代码文件的命名要符合python标识符命名规范
测试函数名要以test开头
运行之前不能在该.py先运行一遍python代码要不然不会有测试结果"""
#*代码文件命名必须符合标识符命名规范(数字、字母、下划线且不能数字开头)!!!!!!!!*
#第一步导包
import unittest

#第二步自定义一个继承unittest.TestCase的类
class TestDemo(unittest.TestCase):
    #第三步书写测试方法 即  用例代码
    #测试方法必须以test 开头  !!!!!!!!
    def test_method1(self):
        print("这相当于一个用例  用例1")   #后面需要换成用例代码,现在还不会哈哈哈
    def test_method2(self):
        print("这相当于一个用例  用例2")

#第四步执行用例
#执行用例 方法1:将光标放在类名后边然后运行,这个方法运行就会执行测试类中所有的测试方法
#执行用例 方法2:将光标放在方法名后边然后运行,这个方法就只会执行该测试方法

在这里插入图片描述
可以通过移除上图中的,就可修改用例运行方法或者说就能以一种新的方法运行用例了。

出现问题一般是以下三个情况:

测试方法没有以test开头
代码文件的命名没有符合python标识符命名规范
运行之前不能在该.py先运行一遍python代码要不然不会有测试结果

TestSuite TestRunner(TestCase数量很多时用,单个完全可以直接在测试类后面选择运行)

TestSuite套件用来打包、管理框架中的测试用例; TestRunner用来运行TestSuite套件

"""
    学习TestSuite和TestRunner的使用   分五步
"""
#第一步:导包
import unittest
#第二步:实例化套件对象
from atest_unittest1 import TestDemo1

suite = unittest.TestSuite()
#第三步:使用套件对象添加用例方法
#两种添加用例方法的方法  suite(TestSuite实例对象名).addTest(测试类名('方法名'))   !!!这种方法一次只能添加一个方法
#第二种!!!:将一个测试类中的所有方法添加到套件对象suite   suite(TestSuite实例对象).addTest(unittest.makeSuite(测试类名))
suite.addTest(TestDemo1('test_method1'))
#第四步:实例化TestRunner
runner = unittest.TextTestRunner()
#第五步:运行套件   runner(TestRunner实例对象).run(套件对象)
runner.run(suite)


TestLoader

使用场景:TestCase非常多,所以如果继续使用suite.addTest(unittest.makeSuite(测试类名))
就需要写num(TestCase)行该语句,不方便
这个时候用TestLoader就可以用一个语句将所有TestCase添加进来

具体用法和代码实现如下:

在这里插入图片描述

方法1:

#在实际测试过程 所有TestCase一般放在一个目录下
#TestLoader使用步骤学习
#第一步:导包
import unittest
import os
#第二步:实例化TestLoader并添加用例
#unittest.TestLoader().discover('用例所在路径', '用例的代码文件名')
#用例路径建议使用相对路径 用例的代码文件名可以使用*去筛选符合某些规则的文件名
suite = unittest.TestLoader().discover('./case', 'atest_unittest2.py')
"""这里语句unittest.TestLoader()是加载一个TestLoader对象;但是加上.discover()之后会变为suite对象;所以说TestLoader是对TestSuite
   的一个补充;也是这里对象名命名为suite的原因"""
#第三步:实例化运行对象并运行
unittest.TextTestRunner().run(suite)

方法2:

import unittest
suite = unittest.defaultTestLoader.discover('case', 'atest_unittest.py')
#因为unittest.defaultTestLoader是默认加载对象所以后面不需要再加个'()'了
unittest.TextTestRunner().run(suite)

Fixture(测试夹具,本质是一种代码结构)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

夹具方法级别用法:

在这里插入图片描述
在这里插入图片描述

夹具类级别用法:

在这里插入图片描述

类级别只执行一次(因为是测试类级别也就是类级别的话就在测试类调用之前或之后执行一次),方法级别在每一次用例执行时就会执行一次。
所以说方法级别、类级别不是说需要我们手动去写某个方法在方法前还是后,而是定义不同的类级别调用前执行的方法(def setUpClass(cls)、类级别调用前要执行的(def tearDownClass(cls))、方法级别调用前方法(def setUp(self))、方法级别调用后方法(def tearDown(self))。

比如测试登录模块,登录模块有多条测试用例,用例之间有一些共有的操作——在执行该测试类之前需要先打开浏览器、在执行测试类的实例方法之前要打开网页(即写了真实的测试用例的操作的实例方法)

2. 断言使用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

断言方法使用方法:

#代码文件命名必须符合标识符规则
#第一步导包
import unittest
#第二步自定义一个继承unittest.TestCase的类
from tools import add


class TestDemo1(unittest.TestCase):
    #第三步书写测试方法 即  用例代码
    #测试方法必须以test 开头
    def test_method1(self):
       self.assertEqual(3, add(1, 2))
    def test_method2(self):
        self.assertEqual(50, add(20, 30))

在这里插入图片描述
右拉点这个可以生成测试报告
self.assertEqual()要求比较严格,有时候你可能不能确定比如说预期结果到底是登录成功还是登陆成功,这就会导致因为测试代码不对造成一个bug,所以这个时候可以用self.assertIn(‘成功’, 实际结果)只需要给一个部分确定的词。所以在有错误出现的时候一定要先确定自己的测试代码是没有问题的。根据需要去选择使用assertIn还是assertEqual并且要注意assertIn适用的是字符串类型数据

3. 实现参数化

在这里插入图片描述
在这里插入图片描述

import unittest
from parameterized import parameterized

from tools import add

test_data = [(1, 2, 3), (2, 3, 5), (30, 10, 40)]      #这里是自己创建的一个简单的,实际工作情况需要读取json文件


class Test_Parameterized1(unittest.TestCase):
    @parameterized.expand(test_data)
    def test_function1(self, a, b, expected_output):
        self.assertEqual(expected_output, add(a, b))
# 参数化最后一步需要组织测试数据(装饰器@)

1.上述代码中的test_data:测试数据必须写成列表里套元组[(0,(),()]或者列表里套列表[[],[],[]];
2. 然后每个元组的数据就是一次要传给测试方法的数据要与测试方法数据位置一一对应(因为是按位置传参的)
3. 有多少个元组就是有多少个用例
4. 单独运行这个带参数化装饰器的代码需要把光标放在@parameterized那一句上面的代码后面不能放在@那一句及其后面的代码句、会报错。

参数化2(从json中读取数据)

1. 创建json文件并写入测试数据

import json

test_data = [[1, 2, 3], [10, 20, 40]]
with open('data.json', 'w') as f:
    f.write(json.dumps(test_data, indent=2))

在这里插入图片描述

2.从json中读取数据传给测试方法,单个运行该测试代码时必须从@parameterized这一句之前右键选择run XXX,否则会报错

import unittest
from parameterized import parameterized
import json

from tools import add


def get_testdata():  # 从json文件中读取测试数据
    with open('D:\浏览器下载\python project\data.json') as f:
        result = json.load(f)  # [[],[]]]
    return result


class Test_Parameterized1(unittest.TestCase):
    @parameterized.expand(get_testdata())
    def test_function1(self, a, b, expected_output):
        self.assertEqual(expected_output, add(a, b))
# 参数化最后一步需要组织测试数据(装饰器@)

跳过

对于一些未完成的或者不满足测试条件的测试方法和测试类,不想执行,就可以使用跳过。使用方法:在不想执行的测试方法或测试类上加@(装饰器)只是@后面跟不同的内容可以完成不同的功能。

  1. 直接将测试函数标记为跳过:@unittest.skip(“描述信息”)
  2. 根据条件判断是否跳过某测试函数;判断条件成立就跳过:@unittest.skipIf(判断条件,“跳过原因、描述信息”)
  3. 代码写在TestCase文件里
    在这里插入图片描述

测试报告

框架自带的测试报告只有在运行TestCase代码文件才能生成。

生成第三方的测试报告

步骤:

1下载好第三方TestRunner类(资源存放在资源库unittest/runner中,可下载后使用),将其放在你的项目目录下
2导包 import unittest; fron HTMLTestRunner iimport HRMLTestRunner
3实例化用来打包用例的加载对象
4实例化第三方TestRunner类
5运行用例
import unittest

from HTMLTestRunner import HTMLTestRunner

suite = unittest.defaultTestLoader.discover('./case', 'test_parameterized.py')
with open('report.html', 'wb') as f:        #**必须是"wb"**
    """第一个参数:必填,报告文件对象;第二个参数:verbosity意味报告的详细程度 默认为1 表示简略,2 表示详细;
       第三个参数:title测试报告的标题;第四个参数:describe 描述信息"""
    runner = HTMLTestRunner(f, 2, "测试报告", "单元测试第三方报告")
    runner.run(suite)

在这里插入图片描述

使用unittest框架测试流程总结

1.组织用例组织用例(创建TestCase代码文件;一般将多个TestCase放在同一个目录下)在TestCase代码文件中可以用装饰器书写参数化、使用断言、使用夹具Fixture代码块、使用装饰器实现跳过;
2.组装(打包)测试用例单个TestCase可以直接运行不需要打包起来再运行了且可生成自带的测试报告。多个TestCase要么使用套件(实例化TestSuite对象并添加用例方法),要么使用加载对象(TestLoader的实例化对象)通过.discover()添加用例方法最终得到返回的suite对象
3.实例化运行对象需要生成第三方测试报告那么实例化的就是第三方TestRunner类的实例对象了,英文的HTMLTestRunner和中文的HTMLTestRunnerCN。runner = HTMLTestRunner(参数)
4.运行runner.run(第二步中的组装对象,一般命名为suite)

第三方中文测试报告

在这里插入图片描述
在这里插入图片描述
相比英文的多了一个用来显示测试人的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值