Python学习——UnitTest自动化测试框架

UnitTest框架的基本使用

1、概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试

2、UnitTest框架的优势:

  • 能够组织多个用例去执行
  • 提供丰富的断言方法
  • 能够生成测试报告

3、核心要素:

  • TestCase(测试用例)
  • TestSuite(测试套件)
  • TestRunner(以文本的形式运行测试用例)
  • TestLoader(批量执行测试用例-搜索指定文件夹内指定字母开头的模块)
  • Fixture(固定装置:两个固定的函数,一个初始化时使用,一个结束时使用)

3.1 TestCase

1、说明:TestCase就是测试用例

2、案例:

1. 导包:import unittest

2. 定义测试类:新建测试类必须继承unittest.TestCase

3. 定义测试方法:测试方法名称命名必须以test开头(注意

import unittest


class Test(unittest.TestCase):
    def test01(self):
        print("测试用例1")

    def test02(self):
        print("测试用例2")

 运行结果:

注意:运行测试类所有的测试方法,光标定位到类当前行右键运行。
           运行单个测试方法:光标放到测试方法当前行。

 3.2 TestSuite

1、说明:多条测试用例集合在一起,就是一个TestSuite(测试套件)

2、使用:

1. 实例化: suite = unittest.TestSuite() 
                (suite:为TestSuite实例化的名称) 

2. 添加用例:suite.addTest(ClassName("MethodName")) 
                (ClassName:为类名;MethodName:为方法名) 

3. 添加扩展:suite.addTest(unittest.makeSuite(ClassName)) 
                (搜索指定ClassName内test开头的方法并添加到测试套件中)

提示:TestSuite需要配合TestRunner才能被执行

3.3 TextTestRunner

1、说明:TextTestRunner是用来执行测试用例和测试套件的

2、使用:

1. 实例化: runner = unittest.TextTestRunner() 

2. 执行: runner.run(suite) # suite:为测试套件名称

3、案例:(左边是主程序文件,右边是TestCase.py文件)

运行结果:

3.4 TestLoader

1、说明:用来加载TestCase到TestSuite中,即加载满足条件的测试用例,并把测试用例封装成测试套件;使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件。

2、使用:

suite = unittest.TestLoader().discover(test_dir, pattern='test*.py') 
    自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件 
    test_dir: 为指定的测试用例的目录 
    pattern:为查找的.py文件的格式,默认为'test*.py' 

    
也可以使用unittest.defaultTestLoader 代替 unittest.TestLoader() 


运行:
    runner = unittest.TextTestRunner() 

    runner.run(suite)

3、TestLoader与TestSuite区别

(1)TestSuite需要手动添加测试用例(可以添加测试类,也可以添加测试类中某个测试方法)

(2)TestLoader搜索指定目录下指定开头.py文件,并添加测试类中的所有的测试方法,不能指定添加某个测试方法


Fixture

1、说明:Fixture是一个概述,对一个测试用例环境的初始化和销毁就是一个Fixture

2、控制级别:

  • 方法级别
  • 类级别
  • 模块级别(了解)

3、 使用:

1、方法级别:

# 初始化(前置处理)
def setUp(self):           --> 首先自动执行

# 销毁(后置处理)
def tearDown(self):        --> 最后自动执行

# 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown

2、类级别:

# 初始化(前置处理)
@classmethod 
def setUpClass(cls):        --> 首先自动执行 

# 销毁(后置处理): 
@classmethod 
def tearDownClass(cls):     --> 最后自动执行

# 运行于测试类的始末,即:每个测试类只会运行一次setUpClass和tearDownClass

3、模块级别(了解)

# 初始化(前置处理) 
def setUpModule():          --> 首先自动执行

# 销毁(后置处理)
def tearDownModule():       --> 最后自动执行

# 运行于整个模块的始末,即:整个模块只会运行一次setUpModule和tearDownModule

4、使用场景:

(1)初始化

  • 获取浏览器实例化对象
  • 最大化浏览器
  • 隐式等待

(2)结束

  • 关闭浏览器驱动对象

断言

1、概念:让程序代替人为判断测试程序执行结果是否符合预期结果的过程

2、常用的UnitTest断言方法:

序号断言方法断言描述
1
assertTrue(expr, msg=None)
验证 expr true ,如果为 false ,则 fail(重要)
2
assertFalse(expr, msg=None)
验证 expr false ,如果为 true ,则 fail
3
assertEqual(expected, actual,msg=None)
验证 expected==actual ,不等则 fail(重要)
4
assertNotEqual(first, second,msg=None)
验证 first != second, 相等则 fail
5
assertIsNone(obj, msg=None)
验证 obj None ,不是则 fail
6
assertIsNotNone(obj, msg=None)
验证 obj 不是 None ,是则 fail
7
assertIn(member, container,msg=None)
验证是否 member in container(重要)
8
assertNotIn(member, container,msg=None)
验证是否 member not in container

3、使用方法:

import unittest
 
def add(x, y): 
    return x + y 

class Assert(unittest.TestCase): 
    def test01(self): 
        num = add(1, 2) 
        self.assertEqual(3, num)     # 判断3是否和num相等

    def test02(self): 
        num = add(1, 2) 
        flag = num == 3 
        self.assertTrue(flag)        # 判断flag是否等于True

参数化

1、概念:通过参数的方式来传递数据,从而实现数据和脚本分离并且可以实现用例的重复执行。

unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展插件parameterized来实现。

2、数据格式:

  • 单个参数:类型为列表
  • 多个参数:类型为列表嵌套元祖
  • 在测试函数中的参数设置变量引用参数值,注意:变量的数量必须和数据值的个数相同

3、使用方式:

  • 导包:from parameterized import parameterized
  • 使用@parameterized.expand装饰器可以为测试函数的参数进行参数化
# 方式一 
@parameterized.expand([(1, 1, 2), (1, 0, 1), (0, 0, 0)]) 
def test_add(self, x, y, expect): 
    pass 

# 方式二 
data = [(1, 1, 2), (1, 0, 1), (0, 0, 0)] 

@parameterized.expand(data) 
def test_add(self, x, y, expect): 
    pass 

# 方式三 
def build_data(): 
    return [(1, 1, 2), (1, 0, 1), (0, 0, 0)] 

@parameterized.expand(build_data) 
def test_add(self, x, y, expect): 
    pass

跳过

1、介绍:对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行

2、使用方法:

# 直接将测试函数标记成跳过 
@unittest.skip(reason) 

# 根据条件判断测试函数是否跳过
@unittest.skipIf(condition, reason)

 注意:以上两种方法,都可以修饰函数(def)和类(class)

3、案例:

import unittest

version = 35

class TestSkip(unittest.TestCase):
    @unittest.skip("代码未完成")
    def test_01(self):
        print("test_01")

    @unittest.skipIf(version <= 30, "版本大于30才会执行")
    def test_02(self):
        print("test_02")

执行结果:


生成HTML测试报告

1、说明:HTML测试报告就是执行完测试用例后,以HTML(网页)方式将执行结果生成报告

2、作用:

  • 测试报告是本次测试结果的体现形式
  • 测试报告包含了有关本次测试用例的详情

3、生成方式:

  • Export Test Results(UnitTest自带)
  • HTML TestRunner(第三方模块)——重要

3.1  Export Test Results

案例:

import unittest

# 定义 测试套件
suite = unittest.defaultTestLoader.discover("./", pattern="test0*.py")

# 自带执行
with open("./report.txt", "w", encoding="utf-8") as f:
    unittest.TextTestRunner(stream=f, verbosity=2).run(suite)

注意:strem是文件流、verbosity是执行方式,可选[1,2,3]

执行结果:

3.2 HTML TestRunner

插件获取:https://pan.baidu.com/s/16rGtY_yIQ7sX5lAFolsGSg?pwd=jl89         提取码:jl89

案例:

# 导包
from tools.HTMLTestRunner import HTMLTestRunner
import unittest

# 定义 测试套件
suite = unittest.defaultTestLoader.discover("./", pattern="test0*.py")

# 插件执行
with open('./report.html', "wb") as f:
    HTMLTestRunner(stream=f, title='xxx自动化测试报告', description='win10 Chrome').run(suite)

stream:文件流,打开写入报告的名称及写入编码格式(html报告必须是二进制形式)

title:[可选参数],为报告标题,如XXX自动化测试报告

description:[可选参数],为报告描述信息;比如操作系统、浏览器等版本

执行结果:

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值