软件测试——Python和UnitTest框架

文章目录

  • 一、软件测试
    • 1.测试计划和测试方案
        • 1.测试计划(管理类型文档)
        • 2.测试方案(技术型文档)
    • 2.非功能测试设计
    • 3.测试报告
        • 1.核心内容
    • 4.处理测试过程中出现不可复现的bug
  • 二、Python
    • 1.常用语法
      • 1.切片
      • 2.字符串查找方法:find()
      • 3.字符串替换方法:replace()
      • 4.字符串拆分方法:split()
      • 5.字符串链接方法:join()
      • 6.列表照片查找数据下标的方法:index()
      • 7.判断容器中某个数据是否存在:in
      • 8.字符串比大小
    • 2.列表
      • 1.统计出现次数:count()
      • 2.添加数据-尾部添加:append()
      • 3.添加数据-指定下标位置:insert()
      • 4.列表合并:extend()
      • 5.删除-根据下标:pop()
      • 6.删除-根据数据值:remove()
      • 7.删除-清空:clear()
      • 8.反转/倒置
      • 9.排序
      • 10.去重
    • 3.元组
      • 1.与列表的区别
    • 4.字典
      • 1.删除
      • 2.查询
      • 3.遍历
    • 5.容器总结
      • 1.加法运算
      • 2.乘法运算
      • 3.len()、in都可以使用
    • 6.函数
    • 7.可变和不可变类型
    • 8.多值参数[可变参数/不定长参数]
      • 1.元组
      • 2.字典
      • 3.参数顺序
    • 9.匿名函数
    • 10.类
      • 1.__init__方法
      • 2.__str__方法
      • 3.__del__方法
      • 4.类方法
      • 5.静态方法
    • 11.文件
      • 1.打开文件:open()
      • 2.打开文件:with open()
      • 3.写文件
      • 4.读文件:read()
      • 5.读文件:readline()
      • 6.关闭文件
    • 12.json文件
      • 1.概念
      • 2.读取文件
      • 3.写文件
    • 13.异常
      • 1.异常捕获
    • 14.模块和包
      • 1.导入模块
      • 2. __name__的作用
  • 三、UnitTest框架
      • 1.TestCase(测试用例)
      • 2.TestSuite(测试套件)
      • 3.TestRunner(测试执行,测试运行)
      • 4.TestLoader(测试加载)
      • 5.Fixture(测试夹具)
      • 6.断言
      • 7.参数化
      • 8.跳过
      • 9.测试报告


一、软件测试

1.测试计划和测试方案

1.测试计划(管理类型文档)

(1)测试目标与范围:
(2)测试角色和职责:
(3)测试进度与资源:
(4)测试风险预估及对应措施:
(3)准入准出标准:

2.测试方案(技术型文档)

(1)测试方法策略:
(2)测试环境要求:
(3)测试工具选择:

2.非功能测试设计

(1)兼容性测试: 软件兼容其他硬件的能力。(版本,设备分辨率)
(2)易用性测试: 是否方便用户,易用易理解。
(3)性能测试: 软件对应系统时间和空间的耗费程度。(首次加载时间,刷新白屏时间,设备CPU和内存耗费比例)
(4)弱网测试: 网络切换。(WiFi网络,移动网络,网络切换正常使用)

3.测试报告

1.核心内容

(1)测试过程回顾
(2)测试统计分析
(3)测试结果确认
(4)测试总结改进

4.处理测试过程中出现不可复现的bug

(1)思考差异,测试步骤,测试账号,测试网络,测试环境。
(2)通过换电脑或环境进行测试复现,借助抓包工具,数据库等。
(3)找高级测试人员、开发人员协助复现。
(4)开发人员协助打印调试日志
(5)版本问题

二、Python

1.常用语法

1.切片

获取字符串中某些字符

字符串[start:end:step]
#start:开始位置下标
#end:结束位置下标,不包括该位置
#step:步长,默认1,可省略
#反转/逆置字符串:字符串[::-1]

2.字符串查找方法:find()

(1)在字符串中查找特定字符串

字符串.find(sub_str,start,end)
#sub_str:要查找的字符串
#start:开始位置,默认0,可省略
#end:结束位置,默认len(),可省略

**(2)返回值:**第一次出现的下标,没有找到则为-1。

3.字符串替换方法:replace()

字符串.replace(old_str,new_str,count)
#old_str:被替换的内容
#new_str:替换为的内容
#count:替换次数,默认全部

返回值: 替换后的字符串,原字符串不变。

4.字符串拆分方法:split()

将一个字符串分为多个,存到列表中。

字符串.split(sep,maxsplit=n)
#sep:分隔符,默认空白字符(空格、换行:\n,tab键:\t)
#maxsplit=n:n为分隔次数,默认全部,可省略

5.字符串链接方法:join()

将字符串插入到列表每个相邻数据之间,组成一个新的字符串。

字符串.join(列表) 
#主要是列表,也可以为其他容器
#列表中数据使用逗号隔开
#列表中数据必须是字符串,否则报错

6.列表照片查找数据下标的方法:index()

列表中无find方法。

列表.index(数据,start,end)
#返回值为第一次出现的下标,没有找到直接报错

7.判断容器中某个数据是否存在:in

数据 in 容器
#存在返回True,不存在返回False

8.字符串比大小

根据ASCII
(1)获取字符对应ASCII值

ord(字符)

(2)获取对应的字符

chr(ASCII值)

2.列表

1.统计出现次数:count()

列表.count(数据)
#返回值:数据出现次数

2.添加数据-尾部添加:append()

列表.append(数据)
#返回:None(关键字,空)

3.添加数据-指定下标位置:insert()

列表.insert(下标,数据)
#如果指定位置原来有数据,原数据将后移
#返回:None(关键字,空)

4.列表合并:extend()

列表1.extend(列表2)
#将列表2中所有数据逐个添加到列表1的尾部
#返回:None(关键字,空)

5.删除-根据下标:pop()

列表.pop(下标)
#下标不写,默认删除最后一个数据
#返回:删除的数据

6.删除-根据数据值:remove()

列表.remove(数据值)
#如果删除的数据不存在,则报错
#返回:None

7.删除-清空:clear()

列表.clear()

8.反转/倒置

#方法1:会得到一个新列表,原列表不会改变
列表[::-1]
#方法2:直接修改原列表,返回None
列表.reverse()

9.排序

列表.sort()
#默认升序列表.sort(reverse=True)
#降序

10.去重

# 1.遍历列表
#2.使用set(自动去重):列表->set->list

3.元组

1.可以存放任意类型的数据
2.可以存放任意多个数据

1.与列表的区别

元组中数据内容不能改变,
元组使用(),

元组列表
数据内容不能改变数据内容可以改变
使用( )使用[ ]

4.字典

1.由键值对组成,{key:value,key:value,…}
2.键是唯一的,不可重复
3.键不可以是列表,一般为字符串、数字。

1.删除

#删除指定键值对
del 字典[]
#清空
字典.clear()

2.查询

#返回值:存在则返回对应的数据值,否则报错。
字典[]#返回值:存在则返回对应的数据值,否则返回括号中书写的数据值(None)
#数据值默认None,可省略
字典.get(,数据值)

3.遍历

(1)对键:

for key in 字典:print(key)#字典.keys()可获取字典中的所有值
for key in 字典.keys():print(key)

(2)对值:

for value in 字典.values():print(value)

(3)对键值对:

for key,value in字典.items():print(key,value)

5.容器总结

1.加法运算

#字符串、列表、元组支持
#'hello world'
str1='hello'+'world'
#[1,2,3,4]
list1=[1,2]+[3,4]
#(1,2,3,4)
tuple1=(1,2)+(3,4)

2.乘法运算

#字符串、列表、元组支持
#'hello hello'
'hello' * 2
#[1,2,1,2]
[1,2] * 2
#(1,2,1,2)
(1,2) * 2

3.len()、in都可以使用

in在字典中是判断键是否存在

6.函数

def 函数名():代码
#查看:Ctrl q
#转到函数声明查看:Ctrl b/Ctrl+鼠标右键

7.可变和不可变类型

(1)是指数据所在内存是否允许修改,可修改为可变类型。(不使用=,变量引用数据内容改变为可变类型)
(2)可变类型:list,dict,set
(3)不可变类型:int,float、bool、str、tuple
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.多值参数[可变参数/不定长参数]

1.元组

(1)在普通参数前加上一个 * —>不定长位置参数
(2)不定长位置参数要写在普通参数的后面
(3)名字一般为args(arguments),即 *args

2.字典

(1)在普通参数前加上两个 * —>不定长位置参数
(2)不定长位置参数要写在普通参数的后面
(3)名字一般为kwargs(keyword arguments),即 **kwargs

3.参数顺序

def 函数名(普通函数,*args,缺省参数,**kwargs):

9.匿名函数

lambda 参数:一行代码
#变量=lambda 参数:一行代码
#使用变量()进行调用#例子:求两个数的乘积
变量=lambda a,b:a * b

10.类

1.__init__方法

(1)适用:
1.给对象添加属性(初始方法、构造方法)。
2.在每次创建对象后都要执行的代码。
(2)创建对象后会自动调用。

(3)例子

#定义添加属性方法
def __init__(self,name,age):self.name=nameself.age=age

2.__str__方法

(1)适用:
1.打印对象时想要查看的信息,一般书写对象的属性信息。
2.类中没定义__str__方法,print(对象),默认输出对象的引用地址
(2)使用print(对象)打印对象时自动调用
(3)必须返回一个字符串
在这里插入图片描述

3.__del__方法

对象被删除销毁时自动调用。(析构方法)

4.类方法

#在方法名字的上方书写@classmethod修饰器
class D:@classmethoddef func(cls): #cls表示类的对象,即classpass

5.静态方法

#在方法名字的上方书写@staticmethod修饰器
class D:@staticmethoddef func():pass

11.文件

1.打开文件:open()

open(file,mode='r',encoding=None)

参数file: 要打开的文件,类型为字符串。路径可以是相对路径(相对于当前代码文件说在路径:./ …/),也可以是绝对路径(从根目录开始书写)。
参数mode: r:只读打开,w:只写打开,a:追加打开,在文件末尾写入内容。
参数encoding: utf-8:将一个汉字转换为3个字节的二进制,gbk:将汉字转换为2个字节的二进制。
返回值: 文件对象

2.打开文件:with open()

#在缩进中读写文件,执行结束后文件会自动关闭
with open(file,mode,encoding='utf-8') as 变量
#与open的区别:文件会自动进行关闭
#mode为a时:文件不存在则自动创建文件,存在时在末尾写入

3.写文件

文件对象.write('写入文件的内容')
#前置条件:文件打开方式是w或者a
#返回值:写入文件的字符数
#在w方式下:文件不存在将会直接创建文件,文件存在则覆盖原文件

4.读文件:read()

文件对象.read(n)
#前置条件:文件打开方式是r
#参数n:表示读取多少个字符,默认全部内容
#返回值:读取到的文件内容,类型为字符串

5.读文件:readline()

一次读取一行内容

文件对象.readline()

6.关闭文件

文件对象.close()
#同时会保存文件

12.json文件

1.概念

1.文件后缀:.json
2.主要数据类型为对象和数组(类似字典{}和列表[])。
3.对象是由键值对组成,每个数据之间用逗号隔开。
4.字符串必须使用双引号。

2.读取文件

#1.导包
import json
#2.打开文件
with open() as 变量:
#3.读文件
json.load(文件对象)

3.写文件

#1.导包
#2.以写(w)方式打开文件
#3.写入
json.dump(数据类型,文件对象)

13.异常

程序遇到异常默认终止代码,使用异常捕获,代码不会终止运行。

1.异常捕获

#捕获任意异常
try:可能发生异常的代码
except:发生了异常执行的代码#捕获特定异常
try:可能发生异常的代码
except 异常类型:发生了异常执行的代码#完整版本
try:可能发生异常的代码
except异常类型1:发生了异常类型1执行的代码
except Exception as 变量:发生其他类型异常的执行代码
else: 没有发生异常会执行的代码
finally:无论是否发生异常都会执行的代码

14.模块和包

1.导入模块

方式1:

import 模块名
模块名.工具名 #使用方法

方式2:

from 模块名 import 工具名
工具名   #使用方法,如果是函数和类需要加括号

方式3:

#将模块中所有内容都导入
from 模块名 import *

2. __name__的作用

1.每个代码文件都是一个模块
2.在导入模块时,会执行模块中的代码
3.__name__变量
(1)是python解释器自动维护的变量
(2)如果代码直接运行,值是"__main__"
(3)如果代码是被导入执行,值是模块名(即文件代码名)

三、UnitTest框架

是Python自带的一个单元测试框架。

1.TestCase(测试用例)

每个TestCase都是一个代码文件,在这个代码文件中来书写用例代码。
步骤:

#1.导包(unittest)
import unittest
#2.自定义测试类(继承unittest模块中的TestCase类)
class TestDemo(unittest.TestCase):
#3,在测试类中书写测试方法(必须以test_开头)def test_method1(self):代码
#4.执行测试用例
#4.1将光标放在类目后面运行,会执行类中所有测试方法
#4.3将光标放在方法名的后面运行,只执行当前的方法

2.TestSuite(测试套件)

用来管理、组装(打包)多个TestCase。

3.TestRunner(测试执行,测试运行)

用来执行TestSuite。
TestSuite和TestRunner的使用:

#1.导包(unittest)
import unittest
from 文件名 import 类名
#接TestCase中代码:from 文件名 import TestDemo#2.实例化(创建对象)套件对象
suite=unnitest.TestSuite()#3.使用套件对象添加用例方法
#方法1:套件对象.addTest(测试类名('方法名'))
suite.addTest(TestDemo(test_menthod1))
#方法2:将一个测试类中的所有方法进行添加,缺点是makeSuit()不会提示
suite.addTest(unittest.makeSuite(TestDemo))#2.实例化运行对象
runner=unittest.TextTestRunner()#5.使用运行对象去执行套件对象:运行对象.run(套件对象)
runner.run(suite)

4.TestLoader(测试加载)

对TestSuite功能的补充。
步骤:

#1.导包
#2.实例化测试加载对象并添加用例->得到的是suite对象
#用例代码文件名可以使用*通配符
suite=unitttest.TestLoader().discover('用例所在路径','用例的代码文件名')#3.实例化运行对象
runner=unittest.TextTestRunner()
#4.运行对象执行套件对象
runner.sun(suite)

5.Fixture(测试夹具)

书写在TestCase代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容。
(1)方法级别:
在每个测试方法执行前后都会自动调用。

#方法执行之前
def setUp(self):每个测试方法执行之前都会执行pass
#方法执行之后
def tearDown(self):每个测试方法执行之后都会执行pass   

(2)类级别:
在每个测试类中所以方法执行前后都会自动调用。(在整个类中执行前后各一次)

#类中所有方法之前
@classmethod
def setUpClass(cls):pass
#类中所有方法之后
@classmethod
def tearDownCalss(self):pass   

(3)模块级别:
在每个代码文件执行前后执行的代码结构。需要写在类的外边直接定义函数,

#代码文件之前
def setUpModule():pass
#代码文件之后
def tearDownModule():pass   

6.断言

方法描述
assertEqual(expected,actual,msg=None)验证expected==actual,不等则不通过,抛出异常
assertNotEqual(first,second,msg=None)验证first!=second,相等等则fail
assertTrue(expr,msg=None)验证expr是false,否则fail
assertFalse(expr,msg=None)验证expr是true,否则fail
assertNone(obj,msg=None)验证obj是None,不是则fail
assertNotNone(obj,msg=None)验证obj不是None,是则fail
assertln(member,container,msg=None)验证是否member in container
assertNotln(member,container,msg=None)验证是否member not in container

7.参数化

使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量。
(1)安装插件:

#在cmd中联网安装
pip install parameterized
#验证:输入后可以看到parameterized
pip list

(2)参数化代码:

#1.导包
import unittest
from parameterized import parameterized
#2.定义测试类(以登录为例)
class TestLogin(unittest.TestCase):
#3.书写测试方法@parameterized.expand(数据变量)#数据要和参数要保存一致def test_login(self,username,password,expect):self.assertEqual(expect,login(username,password)) 
#组织测试数据并传参

8.跳过

#直接将测试函数标记成跳过
@unittest.skip('跳过原因')
#根据条件判断测试函数是否跳过
@unittest.skipIf(判断条件,'跳过原因')

9.测试报告

(1)PyCharm自带的测试报告:
只有单独运行的TestCase的代码才会生成测试报告。
(2)生成第三方的测试报告:(HTMLRunner)
在这里插入图片描述

内容来自黑马自动测试教程

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

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

相关文章

构建应用层(TCP)自定义协议:深入理解序列化与反序列化技术

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 网络版计算器序列化 和 反序列化重新理解 read、write、recv、send 和 tcp 为什么支持全双工自定义协议期望的报文格式 模板方法模式…

开源大数据框架-Ambari+Bigtop如何写metainfo.xml文件

1.如何一键编译?一键安装?你没看错。 👉👉👉 https://gitee.com/tt-bigdata/ambari-env 你以为跟你闹着玩?人狠话不多🙍‍♂️🙍‍♂️🙍‍♂️,直接上图&a…

国庆普及模拟2总结

目录 题目链接: 官方题解: 概述: 总结反思: 题目 T1: 题目分析: 错误代码: 错因: AC代码: T2: 题目分析: 赛时代码&#xf…

Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9

最近折腾小主机,搭建项目环境,记录相关步骤 数据无价,丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录: cd /第一种方式备份命令: tar cvpzf backup.tgz / --exclude/proc --exclu…

CSS基础-常见属性

6、CSS三大特性 6.1 层叠性 如果样式发生冲突,则按照优先级进行覆盖。 6.2 继承性 元素自动继承其父元素、祖先元素所设置的某些元素,优先继承较近的元素。 6.3 优先级 6.3.1 简单分级 1、内联样式2、ID选择器3、类选择器/属性选择器4、标签名选择器/…

若无向图G(V,E)中含7个顶点,为保证图G在任何情况下都是连通的,则需要的边数最少是多少?

这乍一看是不是可抽象(迷糊)了,butttt待我小翻译一下。 先举少一点的例子,假如我们有三个点,我给你两条边,那是不是不管咋连都一定一定是连通的。 那我们再进一步,假如四个点呢?我给…

大厂进阶之CSS死磕牢记的7大知识点

本文主要讨论7大CSS知识点,个个都是金刚附体,干货满满: 1、移动端样式适配 2、回流和重绘 3、flex布局 4、BFC 5、CSS垂直居中方法 6、CSS两栏、三栏自适应布局 7、CSS单行、多行文本溢出省略号格式 一、如何做到移动端样式适配 1、媒体查询…

CloudCompare插件编写

预置环境:Windows10GitCMake3.23.3VS2019Qt5.14.2 编译CloudCompare工程 首先克隆CloudCompare工程,注意必须加上--recursive否则无法下载完整代码编译会失败: git clone --recursive https://github.com/CloudCompare/CloudCompare.git这…

鸢尾花书实践和知识记录[编程1-11二维和三维可视化]

作者空间 文章目录 思维导图函数使用 二维可视化方案平面散点图散点图的示例代码1:绘制鸢尾花的散点图代码2Plotly绘制散点图 数据类型和绘图工具的对应 平面等高线代码3生成等高线网格数据 plotly.express关键的绘图函数 Plotly的另一个模块代码4 Plotly生成的 热图…

李宏毅深度学习-梯度下降和Normalization归一化

Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头(loss等高线的法线方向) Tip1: Tuning your learning rates Adaptive Learning Rates自适应 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不同…

如何使用MethodChannel通信

文章目录 1 概念介绍2 实现方法3 经验总结我们在上一章回中介绍了Visibility组件相关的内容,本章回中将介绍Flutter与原生平台通信相关的内容.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在移动开发领域以Android和IOS SDK开发出的应用程序叫原生开发,开发同一个程序…

Redis: Sentinel工作原理和故障迁移流程

Sentinel 哨兵几个核心概念 1 ) 定时任务 Sentinel 它是如何工作的,是如何感知到其他的 Sentinel 节点以及 Master/Slave节点的就是通过它的一系列定时任务来做到的,它内部有三个定时任务 第一个就是每一秒每个 Sentinel 对其他 Sentinel 和 Redis 节点…

【Canvas与徽章】金圈蓝底国庆75周年徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金边黑盾75周年</title><style type"text/css"&g…

万知:告别繁琐,轻松办公

零一万物这位科技创新的弄潮儿&#xff0c;带着它的最新杰作——万知&#xff0c;闪亮登场。这不仅仅是一个产品&#xff0c;它是对传统工作方式的一次轻松挑战。作为一款一站式AI问答、阅读和创作平台&#xff0c;万知旨在为用户提供高效、便捷的工作体验。万知通过集成多种智…

Suricata:开源网络分析和威胁检测

Suricata 是一款高性能、开源网络分析和威胁检测软件&#xff0c;被大多数私人和公共组织使用&#xff0c;并被主要供应商嵌入以保护他们的资产。 Suricata 功能 Suricata 提供全面的网络安全监控 (NSM) 功能&#xff0c;包括记录 HTTP 请求、捕获和存储 TLS 证书以及从网络流…

关于Vben Admin多标签页面缓存不生效的问题

情况说明 笔者在接手一个基于Vben Admin框架改造的vue3后台管理项目&#xff0c;客户要求在切换头部Tab页面时&#xff0c;不要刷新清空已经填写的表单页面或者表格。 然而&#xff0c;笔者根据Vben Admin的官方文档来配置多标签页面缓存后&#xff0c;页面每次切换后&#x…

光通信——FTTx

目录 FTTH模式 FTTO模式 FTTR模式 FTTB/CLAN/xDSL模式 FTTCabxDSL模式 根据接入光纤到用户的距离分类&#xff0c;PON可应用于光纤到交接箱&#xff08;FTTCab&#xff09;、光纤到大楼/路边&#xff08;FTTB/C&#xff09;、光纤到办公室&#xff08;FTTO&#xff0…

Tiny-universe手戳大模型TinyRAG--task4

TinyRAG 这个模型是基于RAG的一个简化版本&#xff0c;我们称之为Tiny-RAG。Tiny-RAG是一个基于RAG的简化版本&#xff0c;它只包含了RAG的核心功能&#xff0c;即Retrieval和Generation。Tiny-RAG的目的是为了帮助大家更好的理解RAG模型的原理和实现。 1. RAG 介绍 LLM会产…

一文彻底搞懂多模态 - 多模态理解+视觉大模型+多模态检索

文章目录 技术交流多模态理解一、图像描述1. 基于编码器-解码器的方法2. 基于注意力机制的方法3. 基于生成对抗网络的方法 二、视频描述三、视觉问答 视觉大模型一、通用图像理解模型二、通用图像生成模型 多模态检索一、单模态检索二、多模态检索三、跨模态检索 最近这一两周看…

自闭症寄宿学校:为孩子发掘多重才能

在教育的广阔天地里&#xff0c;每一片土壤都孕育着不同的生命&#xff0c;每一颗种子都蕴含着无限的可能。对于自闭症儿童而言&#xff0c;他们的世界或许更加独特与复杂&#xff0c;但同样充满了未被发掘的潜能与才华。在广州&#xff0c;星贝育园自闭症儿童寄宿制学校正以满…