软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试(上):https://developer.aliyun.com/article/1548604
Fixture
- 使用setupclass需要加上@classmethod注解
使用
@classmethod
装饰器将setUpClass
标识为类方法,它的第一个参数通常被命名为cls
,并允许你访问和操作类级别的资源,类方法需要该装饰器
箭头
-> None
不是Python函数定义的一部分,而是类型注释(type hinting)的一部分。它表示函数的返回类型。在这种情况下,-> None
意味着该函数没有返回值,即返回的是None
。在Python中,函数的返回类型通常不需要显式声明,因为Python是一种动态类型语言,函数可以返回各种不同类型的值。然而,类型注释是一种提供额外信息以帮助代码阅读和静态代码分析的机制。在类型注释中,
-> None
表示函数的返回值是None
,即没有返回值。
数据断言
断言方法 | 参数要求 | 作用 |
assertEqual(a, b) |
a 和 b 需要是可比较的,通常是相同类型。 | 检查 a 和 b 是否相等。 |
assertNotEqual(a, b) |
a 和 b 同样需要是可比较的,通常是相同类型。 | 检查 a 和 b 是否不相等。 |
assertTrue(x) |
x 应该是一个布尔值(True 或 False)。 | 检查 x 是否为 True。 |
assertFalse(x) |
x 应该是一个布尔值(True 或 False)。 | 检查 x 是否为 False。 |
assertIs(a, b) |
a 和 b 应该是对象,用于检查对象的身份。 | 检查 a 和 b 是否是相同的对象(身份相同)。 |
assertIsNot(a, b) |
a 和 b 应该是对象,用于检查对象的身份。 | 检查 a 和 b 是否不是相同的对象(身份不同)。 |
assertIn(a, b) |
a 和 b 可以是可迭代的对象,其中 a 是 b 的一个元素。 | 检查 a 是否在 b 中存在。 |
assertNotIn(a, b) |
a 和 b 可以是可迭代的对象,其中 a 不是 b 的一个元素。 | 检查 a 是否不在 b 中存在。 |
assertIsNone(x) |
x 可以是任何对象,用于检查它是否为 None。 | 检查 x 是否为 None。 |
assertIsNotNone(x) |
x 可以是任何对象,用于检查它是否不为 None。 | 检查 x 是否不为 None。 |
可迭代对象是指能够被迭代遍历的数据结构,通常是包含多个元素的集合。在Python中,许多数据类型都是可迭代的,包括但不限于:
- 列表(List):有序的元素集合,可以按照索引访问。
- 元组(Tuple):类似于列表,但是不可变的。
- 字符串(String):由字符组成的有序序列。
- 集合(Set):无序的元素集合,不包含重复元素。
- 字典(Dictionary):包含键-值对的集合,可以按键访问值。
- 范围(Range):表示一系列连续的整数。
- 文件对象(File Object):可以逐行读取文件内容。
- 迭代器(Iterator):自定义的可迭代对象,通过实现
__iter__()
和__next__()
方法来支持迭代。
- 数据断言不返回结果,想要使用变量接收只能获得none
- assetIn方法要求左边是被判断的元素
生成测试报告
import unittest import time from HTMLTestRunner import HTMLTestRunner suite = unittest.defaultTestLoader.discover("../case", pattern="test*.py") if __name__ == '__main__': # 测试报告存放位置 reportDir = '../case/test_report' now = time.strftime("%Y-%m-%d-%H-%M-%S") report_name = reportDir + '/' + now + 'result.html' with open(report_name, 'wb') as f: # 更改为 'wb' 模式 runner = HTMLTestRunner(stream=f, title="标题", description="小标题") runner.run(suite) f.close()
- 该代码所使用的HTMLTestRunner不是原生的,而是经过美化的
- 学习测试报告的前置条件是知道python中的 with 语句
- 文本文件(txt等)使用w模式
- 图片文件使用wb模式
- CSV文件使用a模式追加写
- HTML/XML文件使用w模式
- 测试报告使用wb模式写入图片数据
with语句的主要特点和作用如下:
- 自动调用对象的__enter__()和__exit__()方法进行资源获取和释放操作。
- 可以保证在代码块执行前后正确地打开和关闭资源,不用担心忘记关闭资源导致问题。
as关键字在with语句中的作用和含义是:
- 将文件对象或其他对象赋值给一个变量,以便后续使用。
- 相当于给文件对象或其他对象起一个“别名”
wb和w模式打开文件有以下区别:
- w模式:
以文本写入模式打开文件,如果文件不存在则创建,如果文件存在则将其内容清空后再写入。
这样写入的传输的是bytes
- wb模式:
以二进制写入模式打开文件,如果文件不存在则创建,如果文件存在则将其内容清空后再写入。
这样写入传输的是str
主要区别在于:
- w模式打开文件时采用文本模式,会对换行符等字符做转换。适用于文本文件。
- wb模式打开文件时采用二进制模式,不会对任何字符做转换。数据以原始二进制形式写入。适用于图片、视频等二进制文件。
发送邮件
PageObject模式与思想
雏形
- 将定位元素的值视作属性,将一个页面看作对象(一个类文件)
- 页面对象必须写在path文件夹中
- 最后将所有模块内容组合起来
- 将整个测试流程分层两个模块,Page模块负责页面的操作,而不进行测试
- scripts负责测试
最终版本
- 添加了基类
- 项目结构为基类层,页面层,脚本层
- 小括号表示元组
- 不写小括号也可以
- 解包后,可以被selenium识别到
- 如果要在参数中就解码,那就需要所有用到的地方都使用*
大bug
- 一个是访问基类中的base_click一个是访问当前类的base_click。正确的应该是使用当前类的,然后借着继承关系来访问到基类
- 该bug是个复合bug先数据的拆包没有成功
- 模块需要封装成类方法
dJydHhYx-1715083072843)]
[外链图片转存中…(img-s8fyLE1T-1715083072844)]
- 如果要在参数中就解码,那就需要所有用到的地方都使用*
大bug
[外链图片转存中…(img-bOl9BqsR-1715083072844)]
- 一个是访问基类中的base_click一个是访问当前类的base_click。正确的应该是使用当前类的,然后借着继承关系来访问到基类
[外链图片转存中…(img-FNUg34qz-1715083072845)]
[外链图片转存中…(img-FAhvZlZf-1715083072846)]
- 该bug是个复合bug先数据的拆包没有成功
[外链图片转存中…(img-Ul3kdNmm-1715083072847)]
- 模块需要封装成类方法