什么设计lounger?
我已经维护 seldom 项目多年,他是基于 unittest 、selenium 、requests 和 appium 等技术栈。每当,介绍他的一些功能的时候,总是打上 不思进取
的标签, 大佬,你out了!
, 很好,我继续选择使用pytest!
, 为什么不使用playwright?
。 虽然,我早在 2015 年就写了一系列介绍 pytest 的博客,2020年playwright刚出来的时候,我第一时间介绍 playwright 的使用,甚至下结论认为 playwright 最有可能替代 selenium的Web自动化测试库。
为啥抱着老旧了技术栈不放,这其实有一个惯性,就像新的公司和开发会选择 go,老的公司和开发依然在使用Java,他们在Java打磨多年,各种基础服务、框架和规范都很成熟,除非go语言有降为打击的能力(性能、开发效率、维护成本、生态、人员梯队等),显然,没有,那Java开发为什么必须要转go呢?
当我将seldom打磨的足够好用的时候(开箱即用),显然,没有足够的动力去用pytest + 各种库和插件(需要自己拼装)!
最近,我重新全面的学习了一遍 pytest 框架,基于 pytest 框架的特点,结合seldom的一些经验,尝试设计 lounger 框架。
为什么叫 lounger ?
首先, lounger
关键字在 pypi.org
上没有被占用, 其次, 我想尽量的降低你的使用成本, 让你有更多时间偷懒摸鱼, 所有这是给 懒人
用的自动化测试框架。
介绍
Next generation automated testing framework.
当然,纯粹是一个噱头,反正, 下一代
就感觉更新,更牛X。
注意:这个框架目前仅用于学习,计划的许多功能还没开发,一些功能也许会调整。欢迎阅读源码。
特点
-
支持
web
/api
测试。 -
支持脚手架,命令生成测试项目。
-
支持数据库操作。
-
更好用的数据驱动。
架构
lounger不是一个从零开始的自动化测试框架,建立在pytest生态的基础上,提供更加简单的使用体验。
通过架构可以看到,lounger集成了主流的扩展插件, 当然,我为了将接口 自动化剥离出去,单独开发了 pytest-req
插件,其实,就是希望 lounger 框架更加解耦,一些东西变得可插拔。
当然,单纯把一堆pytest插件集成到一起就自称开发了个框架,那就太不要脸了。你说对吧!?总要有点自己的东西。
-
脚手架:通过一个命令创建自动化项目,可以节省时间。
-
数据驱动:我曾经吐糟过 pytest 的数据驱动太狗屎了,于是,把他变得和seldom一样好用。
-
数据库操作:支持 sqlite3、MySQL、PostgreSQL、SQL Server等数据库操作,和seldom 一样好用。
-
自动失败截图:不需要做任何配置,基于
pytest-html
用例失败时,自动截图。 -
...
安装
正在开发中,暂不提供pip安装。
-
安装方式一:
-
git clone https://github.com/SeldomQA/lounger
-
cd lounger
-
pip install .
-
安装方式二:
-
pip install -U git+https://github.com/SeldomQA/lounger.git@main
其实是我的pypi.org的账号丢了,无法提交。我给官方提了issues试图找回,所以,暂时不想创建个新的账号提交。就是这样了。
此外,如果做Web自动化测试,请单独安装测试浏览器。
-
playwright install chromium[可选]
-
playwright install firefox[可选]
-
playwright install webkit[可选]
-
...
使用
写文档需要巨大的投入,我还没写,好在我开发的每个功能都有测试用例。你可以在 tests
目录下找到这些测试用例。一看便知!
脚手架
-
创建web自动化测试项目。
-
lounger -pw myweb
-
2024-08-17 22:05:04 | INFO | cli.py | Start to create new test project: myweb
-
2024-08-17 22:05:04 | INFO | cli.py | CWD: D:\github\seldomQA\lounger
-
2024-08-17 22:05:04 | INFO | cli.py | created folder: myweb
-
2024-08-17 22:05:04 | INFO | cli.py | created folder: myweb\reports
-
2024-08-17 22:05:04 | INFO | cli.py | created file: myweb\test_web.py
-
2024-08-17 22:05:04 | INFO | cli.py | created file: myweb\pytest.ini
-
创建api自动化测试项目。
-
lounger -pa myapi
-
2024-08-17 22:05:31 | INFO | cli.py | Start to create new test project: myapi
-
2024-08-17 22:05:31 | INFO | cli.py | CWD: D:\github\seldomQA\lounger
-
2024-08-17 22:05:31 | INFO | cli.py | created folder: myapi
-
2024-08-17 22:05:31 | INFO | cli.py | created folder: myapi\reports
-
2024-08-17 22:05:31 | INFO | cli.py | created file: myapi\test_api.py
-
2024-08-17 22:05:31 | INFO | cli.py | created file: myapi\pytest.ini
-
直接运行测试
-
cd myweb # or myapi
-
pytest
数据驱动
代码中的数据驱动:
-
from lounger import data
-
@data([2, 4, 6])
-
def test_params(params):
-
print("params", params)
-
assert params % 2 == 0
-
@data([
-
(1, "hello"),
-
(2, "world"),
-
])
-
def test_tuple(params):
-
print(params[0], params[1])
-
@data([
-
["case1", "tom"],
-
["case2", "jack"],
-
])
-
def test_list(params):
-
print(params[0], params[1])
-
@data([
-
{"username": "admin", "password": "admin123"},
-
{"username": "guest", "password": "guest123"},
-
])
-
def test_dict(params):
-
print(params["username"], params["password"])
支持文件数据驱动:
-
from lounger import file_data
-
@file_data("json_data.json", key="login")
-
def test_json_dict(params):
-
"""
-
used file_data test
-
"""
-
print(params)
-
@file_data("yaml_data.yaml", key="name")
-
def test_yaml_list(params):
-
"""
-
used file_data test
-
"""
-
print(params)
-
@file_data("yaml_data.yaml", key="login")
-
def test_yaml_dict(params):
-
"""
-
used file_data test
-
"""
-
print(params)
-
@file_data("csv_data.csv", line=2)
-
def test_csv(params):
-
"""
-
used file_data test
-
"""
-
print(params)
-
@file_data(file="excel_data.xlsx", sheet="Sheet1", line=2)
-
def test_excel(params):
-
"""
-
used file_data test
-
"""
-
print(params)
用法和 seldom 不能说一样,只能说完全相同,支持 csv、excel、json、yaml 等文件格式数据,自动查找文件的位置,你都不用太关心数据文件放哪里。
Web测试
集成了 pytest-playwright 插件,已经足够好用了,lounger 暂时并没有做任何额外的事情。
-
"""
-
run test:
-
> pytest --browser=chromium --headed -vs test_playwright.py
-
"""
-
import re
-
from playwright.sync_api import Page, expect
-
def test_has_title(page: Page):
-
page.goto("https://cn.bing.com")
-
# Expect a title "to contain" a substring.
-
expect(page).to_have_title(re.compile("Bing"))
API测试
集成了 pytest-req 插件,功能都已经在 pytest-req
插件中实现,lounger 暂时并没有做任何额外的事情。
-
"""
-
run test:
-
> pytest -vs --base-url https://httpbin.org test_request.py
-
"""
-
def test_put_method(put, base_url):
-
"""
-
test put request
-
"""
-
s = put(f'{base_url}/put', data={'key': 'value'})
-
assert s.status_code == 200
数据操作
以下是MySQL数据操作的API,其他数据库操作类似,需要单独安装数据库驱动即可。
-
from lounger.db_operation import MySQLDB
-
class TestMySQL:
-
"""测试操作MySQL数据库API"""
-
def setup_method(self) -> None:
-
""""初始化DB连接"""
-
self.db = MySQLDB(host="localhost", port=3306, user="root", password="123456", database="guest3")
-
self.db.execute_sql("INSERT INTO api_user (name, age) VALUES ('test', 11) ")
-
def teardown_method(self) -> None:
-
self.db.delete("api_user", {"name": "test"})
-
def test_query_sql(self):
-
"""测试查询SQL"""
-
result = self.db.query_sql("select * from api_user")
-
assert isinstance(result, list)
小结:
虽然,pytest相比较unittest有诸多优点,但是,在开发 lounger 的过程中仍然遇到不少问题,例如,如何将 loguru 的日志写到 pytest-html报告中;如何设计针对 Web/API 的断言。如何支持平台化。lounger(pytest) 还有很多可摸索的东西。
lounger 有很多与 seldom 相同的API,没错,有些功能是直接移植过来的。
lounger是seldom的替代品吗?目前不是,seldom已经非常成熟了,除了在多线程方面有明显的不足,其他的功能非常完善,我不会放弃seldom的开发维护。当然,我也会继续投入lounger的开发。
欢迎阅读源码,欢迎参与到 lounger 项目的开发中。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。