视频:hytest - 测试自动化框架_哔哩哔哩_bilibili
hytest 简介
hytest
(黑羽test)是白月黑羽自己研发的自动化测试框架,它非常适合 做 系统测试 自动化, 而相比之下,pytest、unittest 更适合白盒的单元测试、集成测试。
特别注意,hytest是基于selenium工具的测试框架。语法用的是selenium的语法。
安装:
pip install hytest
运行:在要测试的目标软件的上一级目录使用: python -m hytest.run
结果:会自动生成一个中文版的测试报告。
如果要生成一个英文版的测试报告,只需要加上 --lang =en
用例目录结构:
自动化测试用例
是 写在 python 文件 中的 一个 python 类。对应一个测试用例文档里面的用例-
一个 代码文件 可以存放 多个用例
-
多个代码文件可以用目录组织起来
cases
目录下面的 每个目录 和 py 文件 都 被称之为 测试套件(suite)。测试套件
是 测试用例的集合
, 通俗的说,就是 一组用例
。
总结:要运行登录测试.py,不能通过python运行。而是在hytestProject这级目录的终端,使用pytest命令即可,log目录是使用pytest命令之后生成的目录。
前置环境:创建一个cases目录。
用例类的定义:
文件里面每个类对应一个用例。类的 name
属性 指定 用例名。若没有name属性,那么类名会被当做用例名称。类的testeps方法 对应测试步骤代码。
# 建议:类名 对应 用例编号
class UI_0101: //这个是类名UI_0101
# 测试用例名字,也建议以用例编号结尾,方便 和 用例文档对应
# 也方便后面 根据用例名称 挑选执行
name = '管理员首页 - UI-0101' //name表示测试用例名
# 测试用例步骤
def teststeps(self): //teststeps()方法,是步骤
最常用函数和结构:
from hytest import STEP, INFO, CHECK_POINT
class UI_0101:
def teststeps(self):
STEP(1,'打开浏览器') //声明每个测试步骤
var1 = 'sdf'
INFO(f'var1 is {var1}') //打印信息在日志报告中,
//而使用print是打印在终端中。
CHECK_POINT('打开成功', var1.startswith('1sd') )
STEP(2,'登录')
CHECK_POINT('检查登录是否成功', True) //声明测试过程中的检查点,
//任何一个测试点不通过就不会继续执行。
//通过CHECK_POINT('即使不通过也不中止',False,failStop=False)可以执行之后的语句
STEP(3,'查看菜单')
CHECK_POINT('检查菜单是否正确', True)
一个例子:
注意,资料上使用的wd.find_element_by_id('username').send_keys('byhy')
这种方式已经淘汰了。
from hytest import *
from selenium import webdriver
from selenium.webdriver.common.by import By
class UI_0101:
name = '检查操作菜单 UI_0101'
def teststeps(self):
STEP(1,'登录网站')
options = webdriver.EdgeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
wd = webdriver.Edge(options=options)
wd.implicitly_wait(10)
wd.get('http://127.0.0.1/mgr/sign.html')
wd.find_element(By.ID,'username').send_keys('byhy')
wd.find_element(By.ID,'password').send_keys('88888888')
wd.find_element(By.TAG_NAME,'button').click()
STEP(2,'获取左侧菜单信息')
eles = wd.find_elements(By.CSS_SELECTOR,'.sidebar-menu li span')
menuText = [ele.text for ele in eles]
INFO(menuText)
STEP(3,'检查菜单栏')
CHECK_POINT('左侧菜单检查', menuText[:3] == ['客户','药品', '订单'])
wd.quit()
执行结果:
公共代码放入库中:
资料上运行通过不了,可以尝试使用hytest +测试的目录
而只使用hytest,会出现:ModuleNotFoundError: No module named 'hytestProject'
这种错误。
初始化、清除:
hytest 的初始化/清除 支持 3种方式
- 单个用例的初始化、清除
- 整个用例文件的初始化、清除
- 整个用例目录的初始化、清除
整个用例文件的初始化、清除
,就是在 文件中 添加全局函数 suite_setup
和 suite_teardown
缺省初始化、清除
就是定义 名称为 test_setup
和 test_teardown
的全局函数。
数据关联:
可以使用hytest内置的对象 GSTORE
,这个 GSTORE,可以使用字典式的赋值和取出元素,比如
from hytest import GSTORE
def suite_setup():
GSTORE['环境1产品id'] = createProduct()
GSTORE['driver'] = webdriver.Chrome()
def suite_teardown():
deleteProduct(GSTORE['环境1产品id'])
GSTORE['driver'].quit()
class c00303:
name = '添加订单 - API-0303'
def teststeps(self):
createOrder(productid=GSTORE['环境1产品id'])
比如,可以在项目根目录下面创建一个share.py文件,内容如下
from selenium import webdriver
class gs:
driver : webdriver.Chrome
productId : int
然后用例文件、 __st__.py
文件就可以这样使用了
from share import gs
def suite_setup():
gs.productId = createProduct()
gs.driver = webdriver.Chrome()
def suite_teardown():
deleteProduct(gs.productId)
gs.driver.quit()
class c00303:
name = '添加订单 - API-0303'
def teststeps(self):
createOrder(productid=gs.productId)
gs 定义的时候,里面的各个属性就有类型声明,后面使用该属性时,IDE就可以进行代码辅助了
数据驱动 - data driven:
如果有一批测试用例,具有 相同的测试步骤
,只是 测试参数数据不同
。自动化测试时,把测试数据从用例代码中 分离
开来,以后增加新的测试用例,只需要修改数据。
例如:
class c00003x:
# ddt_cases 里面每个字典元素 定义一个用例的数据
# 其中: name是该用例的名称, para是用例的参数
ddt_cases = [
{
'name' : '登录 - 000031',
'para' : ['user001','888888']
},
{
'name' : '登录 - 000032',
'para' : ['user0012','888888']
},
{
'name' : '登录 - 000033',
'para' : ['ser001','888888']
}
]
# 调用时,
# hytest 框架执行时,会自动创建出3份用例实例
# 并且在调用 teststeps时,把每个用例的参数设置在 self.para 中
# 用例代码 可以直接从 self.para 中获取参数
def teststeps(self):
# 取出参数
username, password = self.para
# 下面是登录测试代码
动态产生驱动数据:跳过
挑选用例执行 - 名称方式:
冒烟测试,只需要测试冒烟测试的那些用例。 或者调试自己写的某个用例的自动化,就只需要执行那一个用例。通过 --test
或者 --suite
命令行参数 来指定执行哪些用例或者套件,
比如,我们想只测试 药品管理
这个套件:hytest --suite 药品管理
比如,我们想只测试 界面 - UI-0101
这个用例:hytest --test "界面 - UI-0101"
也可以使用通配符表示:hytest --test *0101 就是上一个例子的另一种写法。
如果要执行的用例太多,比如 1000 个,命令行参数岂非太长了?这时我们可以使用参数文件,可以把所有的参数都放在参数文件中,比如,创建一个名字为 args 的参数文件,内容如下
--test *0301
--test *0302
--test *0303
--test *1401
--test *1402
一行一个参数,然后, 我们的命令就只需要 hytest -A args
就可以了
挑选用例执行 - 标签方式:
hytest 还有一种选择测试用例的方法:根据用例的 标签
来挑选用例。
测试用例可以有多个标签描述它的属性特征, 比如一个登录测试的用例, 可以有3个标签: 登录功能、冒烟测试、UI测试。hytest 可以根据设置的标签 选择执行该用例。
给用例添加标签有如下几种方式
- 全局变量 force_tags
如果我们在测试用例文件 定义了一个名为 force_tags 的全局变量,格式如下
force_tags = ['登录功能','冒烟测试','UI测试']
断点调试:
暂时跳过。
内容有点多,有些内容可以在工作之后在来回顾,暂时了解到这里就够了。