Python + UnitTest 软件测试流程总结

news2024/11/28 6:31:34

以测试用户登录流程为例:

TestCase:

TestCase 主要用来编写测试用例,这里结合 断言(assertEqual 和 assertIn) 进行判断,避免了手动书写判断。

# tools.py
# 登录验证方法
def login(username, password):
    if username == 'admin' and password == '123456':
        return '登录成功'
    else:
        return '登录失败'
# TestCase.py
# 导入 unittest
import unittest
from tools import login


class TestLogin(unittest.TestCase):
    def test_username_password_ok(self):
        self.assertEqual('登录成功', login('admin', '123456'))

    def test_username_error(self):
        self.assertEqual('登录失败', login('root', '123456'))

    def test_password_error(self):
        self.assertEqual('登录失败', login('admin', '123123'))

    def test_username_password_error(self):
        # self.assertEqual('登录失败', login('root', '123123'))
        self.assertIn('失败', login('aaa', '123123')) # 结果中包含“失败”即可

TestSuite:

TestSuite 用来管理多个 TestCase 文件,使用 unittest.TestSuite() 实例化套件对象,再使用套件对象添加用例方法。

假如创建多个 TestCase 文件:

# testCase1.py
# 导包
import unittest

# 自定义测试类,继承 unittest 类中 testCase 类
class testDemo1(unittest.TestCase):
    # 测试方法(用例代码)
    def method1(self):
        print('测试方法1-1')

    def method2(self):
        print('测试方法1-2')
# testCase2.py
# 导包
import unittest

# 自定义测试类,继承 unittest 类中 testCase 类
class testDemo2(unittest.TestCase):
    # 测试方法(用例代码)
    def method1(self):
        print('测试方法2-1')

    def method2(self):
        print('测试方法2-2')

TestRunner:

用来执行对象。

# TestSuite_Runner.py
# TestSuite用来管理多个TestCase文件
# 1.导包
import unittest
# 2.实例化(创建对象)套件对象
from testCase1 import testDemo1
from testCase2 import testDemo2
from TestCase import TestLogin

suite = unittest.TestSuite()
# 3.使用套件对象添加用例方法
# 方法一:套件对象.addTest(测试类名('方法名'))
suite.addTest(testDemo1('method1'))
suite.addTest(testDemo1('method2'))
suite.addTest(testDemo2('method1'))
suite.addTest(testDemo2('method2'))

# 方法二:将一个测试类中的所有方法进行添加
# 套件对象.addTest(unittest.makeSuite(测试类名))
suite.addTest(unittest.makeSuite(testDemo1))
suite.addTest(unittest.makeSuite(testDemo2))
suite.addTest(unittest.makeSuite(TestLogin))

# 4.实例化运行对象
runner = unittest.TextTestRunner()

# 5.使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)

TestLoader:

用于多个 TestCase 中有多个 Method 时,写法较简便

# TestLoader.py
# 1.导包
import unittest

# 2.实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在的路径', '用例的代码文件名')
suite = unittest.TestLoader().discover('./case', '*.py')
# suite = unittest.defaultTestLoader().discover('./case', '*.py') 两种写法

# 将3.4.合并
unittest.TextTestRunner().run(suite)

TestFixture:

在执行每个测试方法的前后会出现一些重复操作,可以使用 TestFixture 进行书写。

# TestFixture.py
import unittest

class TestLogin(unittest.TestCase):
    # 1.打开浏览器(整个测试过程中就打开一次浏览器) 类级别
    @classmethod
    def setUpClass(cls) -> None:
        print('打开浏览器')

    # 2.输入网址(每个测试方法都需要一次) 方法级别
    def setUp(self):
        # 每个测试方法执行之前都会调用的方法
        print('输入网址')

    # 3.输入用户名密码验证码点击登录(不同的测试数据) 测试方法
    def test_1(self):
        print('输入正确信息,点击登录1')

    def test_2(self):
        print('输入错误信息,点击登录2')

    # 4.关闭当前页面(每个测试方法都需要一次) 方法级别
    def tearDown(self):
        # 每个测试方法执行之后都会调用的方法
        print('关闭当前页面')

    # 5.关闭浏览器(整个测试过程中就关闭一次浏览器) 类级别
    @classmethod
    def tearDownClass(cls) -> None:
        print('关闭浏览器')

Skip:

不想执行某个测试用例时,可以进行直接跳过(skip)或者条件触发(skipIf)跳过。

# skip.py
# 导包
import unittest

version = 30

# 自定义测试类
class testDemo(unittest.TestCase):
    # 测试方法
    @unittest.skip('直接跳过')
    def test_method1(self):
        print('测试方法111')

    @unittest.skipIf(version >= 30, '版本高跳过测试')
    def test_method2(self):
        print('测试方法222')

    def test_method3(self):
        print('测试方法333')
# 执行用例(方法)

Parameterized:

在实际开发中,测试用例的数据不能写死,这时用到json文件的读取,之后利用 parameterized 对读取函数进行调用。

首先执行 pip install parameterized 下载;

之后在模块中导入 from parameterized import parameterized

# 导入unittest/parameterized
import json
import unittest
from parameterized import parameterized
from tools import login


# 组织测试数据
def build_data():
    with open('data.json', encoding='utf-8') as f:
        result = json.load(f)
        data = []
        for info in result:
            data.append((info.get('username'), info.get('password'), info.get('expect')))
    return data

# 定义测试类
class TestLogin(unittest.TestCase):
    # 书写测试方法(用到的测试数据使用变量代替)
    @parameterized.expand(build_data())
    def test_login(self, username, password, expect):
        self.assertEqual(expect, login(username, password))

 这里的 data.json:

[
  {
    "desc": "正确用户名密码",
    "username": "admin",
    "password": "123456",
    "expect":"登录成功"
  },
  {
    "desc": "错误用户名",
    "username": "root",
    "password": "123456",
    "expect":"登录失败"
  },
  {
    "desc": "错误密码",
    "username": "admin",
    "password": "123123",
    "expect":"登录失败"
  }
]

在此过程中会生成测试报告,在终端中执行代码后,按照以下步骤可以进行查看:

 

 

运行html文件即可,效果如图:

这样生成的测试报告相对简陋,可以使用第三方库生成,在当前目录中放入顶部的两个文件。

接下来书写以下代码:

# 利用第三方生成测试报告
# 中文版
# 1.获取第三方的 测试运行类模块,将其放在代码的目录中
# 2.导包 unittest
import unittest
from HTMLTestRunnerCN import HTMLTestReportCN

# 3.使用 套件对象,加载对象 去添加用例方法
suite = unittest.defaultTestLoader.discover('.', 'pa*login.py')
# 4.实例化 第三方的运行对象
file = 'report_cn.html'
with open(file, 'wb') as f:
    # 运行对象(第二个参数是:是否详细 1/2,第三个参数是报告标题,第三个参数是python/pycharm版本)
    runner = HTMLTestReportCN(f, 2, '测试报告中文版', 'python 3.6.7')
    # 5.运行 套件对象
    runner.run(suite)

# --------------------上下两端代码不要一起执行------------------------

# 1.获取第三方的 测试运行类模块,将其放在代码的目录中
# 2.导包 unittest
import unittest
# 英文版
from HTMLTestRunner import HTMLTestRunner

# 3.使用 套件对象,加载对象 去添加用例方法
suite = unittest.defaultTestLoader.discover('.', 'pa*login.py')
# 4.实例化 第三方的运行对象
file = 'report.html'
with open(file, 'wb') as f:
    # 运行对象
    runner = HTMLTestRunner(f, 1, '测试报告', 'python 3.6.8')
    # 5.运行 套件对象
    runner.run(suite)

效果如下: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio导入,删除第三方库

Android项目经常用到无私的程序员们提供的第三方类库。本篇博客就是实现第三方库的导入和删除。 一、导入第三方库 1、将需要的库下载到本地; 2、新建Moudle (1)File --- New Moudle (2)选择Android Library --- Next (3)填写Moudle名 --- Finish。一个新的Mou…

【优选算法系列】【专题七分治】第一节.75. 颜色分类和912. 排序数组

文章目录 前言一、颜色分类 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、排序数组 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、颜色分类 1.1 题目描述 描述&…

QML9、输入元素

1、输入元素(Input Element) 我们已经使用过MouseArea(鼠标区域)作为鼠标输入元素。这里我们将更多的介绍关于键盘输入的一些东西。我们开始介绍文本编辑的元素:TextInput(文本输入)和TextEdit(文本编辑)。 2、文本输入(TextInput) 文本输入允许用户输入一行文本…

Redis之缓存

文章目录 前言一、缓存使用缓存的原因 二、使用缓存实现思路提出问题 三、三大缓存问题缓存穿透缓存雪崩缓存击穿互斥锁实现逻辑过期时间实现 总结 前言 本篇文章即将探索的问题(以黑马点评为辅助讲解,大家主要体会实现逻辑) 使用redis缓存的…

Nmap-NSE

一.Nmap的脚本引擎类别 参数说明ALL允许所有的脚本Auth认证Default默认的脚本引擎,-sC:equivalent to --script default 或 --script default ,执行一些脚本的脚本扫描Discovery发现,获取目标的深度信息External扩展&#xff0c…

2023面试笔记四

1、gc导致的cpu冲高 排查是否为gc导致,看如下两点: gc频率和耗时 内存占用率 (1)gc频率和耗时有两种手段看: 第一种:根据gc日志的打印时间,可确定每次gc间隔的时间和耗时: 使用…

聚铭国产化日志合规版 → 中小企事业单位等保建设的最优解

聚铭网络最新发布聚铭综合日志分析系统国产化合规版本 ,相较于同类型同档次非国产化设备性能无衰减、功能无裁减、成本不提高,适用于信创替换以及等保日志建设等应用场景。 面对日趋复杂的外部环境,近年来,国家越来越重视关键技术…

谭浩强【C语言程序设计】第一章习题详解

目录 1,什么是程序?什么是程序设计? 2,为什么需要计算机语言?高级语言有哪些特点? 3,正确理解以下名词及其含义: (1)源程序,目标程序,可执行程序。 (2)程…

免费小程序HTTPS证书

随着互联网的快速发展,小程序已经成为人们日常生活中不可或缺的一部分。然而,在小程序的开发和使用过程中,安全问题一直是开发者们关注的重点。其中,HTTPS 证书是保障小程序安全的重要工具之一。在这方面,免费的小程序…

【机器学习】正则化到底是什么?

先说结论:机器学习中的正则化主要解决模型过拟合问题。 如果模型出现了过拟合,一般会从两个方面去改善,一方面是训练数据,比如说增加训练数据量,另一方面则是从模型角度入手,比如,降低模型复杂…

HDR 成像技术学习(四)

HDR(High Dynamic Range,高动态范围)仿佛是成像领域永恒的话题,动态范围越大,图像能清晰呈现的明暗差别也就越大。与传统的SDR(标准动态范围)相比,HDR图像能够以更高质量同时显示画面的亮部和暗部。 随这些年CMOS图像传感器工艺技术进步,以及后端数字信号处理算力的提升…

编译内核源码

本文将记录内核源码编译步骤,供有需要的人参考使用。 一、内核源码下载网址 内核源码网址:https://kernel.org/ 二、准备编译环境 这里需要注意区分x86架构和arm架构,需要不同的架构内核就准备对应的服务器即可,在服务器上安装…

arthas常用命令

arthas常用命令 IDEA插件 arthas idea退出arthasjad 反编译watch 方法执行数据观测tracemonitor https://arthas.aliyun.com/doc/ IDEA插件 arthas idea 退出arthas # quit或者exit命令,只是退出当前的连接, Attach到目标进程上的arthas还会继续运行,端口会保持开…

火力全开!腾讯云这次直接开卖5年

如果你是一名网站管理员,或者是一名创业公司的CEO,那么腾讯云这个词一定不会陌生。作为国内领先的云计算服务提供商,腾讯云一直以来都在为各行各业的用户提供着高效、稳定、安全的云计算服务。 而在今天,我们要给大家带来一个重磅…

2020年五一杯数学建模B题基于系统性风险角度的基金资产配置策略分析解题全过程文档及程序

2020年五一杯数学建模 B题 基于系统性风险角度的基金资产配置策略分析 原题再现 近年来,随着改革开放程度的不断提高,我国经济运行中的各种风险逐渐暴露并集中传导和体现于金融领域。党的“十九大”报告提出“守住不发生系统性金融风险的底线”要求&am…

官媒代运营:让大众倾听品牌的声音

在当今数字时代,媒体的影响力和多样性远远超出了以往的范畴。品牌和企业越来越依赖媒体来传播信息、建立声誉以及与大众互动。而媒体矩阵成为了现代品牌传播的关键策略,使大众能够倾听品牌的声音。媒体矩阵:多元化的传播渠道 媒体矩阵是指利…

使用双动态令牌混合器学习全局和局部动态以进行视觉识别

TransXNet: Learning Both Global and Local Dynamics with a Dual Dynamic Token Mixer for Visual Recognition 1、问题与解决2、引言3、方法3.1 双动态令牌混合器(D- Mixer)3.2 IDConv(Input-dependent Depthwise Convolution)3.3 Overlapping Spatial Reduction Attention …

玩具品牌的国际化之路:市场推广战略解析

玩具产业一直是全球市场中备受瞩目的领域之一。随着全球化的发展和互联网的普及,越来越多的玩具品牌开始进军国际市场。这既是机遇,也是挑战。在竞争激烈的全球市场中,如何成功推广玩具品牌是一个关键的问题。本文Nox聚星将和大家探讨玩具品牌…

Live800:企业客户服务如何数字化转型?

现代社会,随着互联网的快速发展,企业客户服务也在不断的数字化转型。数字化转型不仅可以更好地为客户提供服务,也可以提高企业的效率和降低成本。那么,企业客户服务如何数字化转型呢? 一、在线客服系统 在线客服系统是…

ECharts常用配置

1.使用: (1).下载引入 npm install echarts(版本号) --save import * as echarts from "echarts"; (2).准备一个DOM容器 (3).初始化echarts实例对象 echarts.init(document.getE…