LOL腾讯游戏平台 开源一套通用测试Skills框架: 赈济Web/App/接口调和妙技调用

一、测试团队越作念越累,不是东说念主不够,是妙技太散
上个月,我帮一个中型电商团队作念技能评审。
他们有三个测试小组:Web、App、接口。
Web组用Playwright。
App组用Appium。
接口组用Requests + Pytest。
三个组,三套代码仓库,三种定位器写法,三种恭候计策。
新东说念主进来,要先学三套东西。
一个跨端场景(比如从Web下单,App阐发成绩),要三个组各写一遍,再用音问队伍串起来。
他们问我:是不是该裁掉一组东说念主,粗略调和用某个买卖平台?
我说:问题不在东说念主,在你们的妙技莫得调和综合。
每一端齐在作念类似的事:
点击、输入、赢得文本、恭候要求、发送申请、断言反应。
但每个框架齐用我方的容貌抒发这些“妙技”。
Web的“点击”是page.click(locator),
App的“点击”是element.click,
接口的“申请”是requests.post(url, data)。
本体上,它们齐是“推论一个算作并考证后果”。
但你们的代码里,每一层齐在类似杀青调遣、重试、日记、断言。
这不是技能债,这是架构债。
我用了三周时分,把往常几年在多个技俩里积聚的教授抽出来,作念了一个通用测试Skills框架。
中枢概念很简便:
一套妙技描绘,同期驱动Web、App、接口。
调和调用容貌,调和妙技注册,调和后疏漏言。
代码还是开源。底下证明晰它何如责任。
二、本体不是缺框架,是缺“调和调用层”
许多东说念主一听到“调和框架”,第一反应是再作念一套超等框架,把统统底层齐包进去。
那是舛错的念念路。
正确的念念路是:不要在底层调和,要在“妙技调用层”调和。
什么是妙技?
妙技是一个可定名的、有输入输出、有推论逻辑的最小测试单位。
比如:
click(selector) 是一个妙技
input_text(selector, text) 是一个妙技
http_get(url) 是一个妙技
wait_for_element(selector, timeout) 是一个妙技
assert_text_contains(text) 是一个妙技
Web端需要这些妙技,App端也需要,接口端需要的仅仅其中一部分。
要道在于:
妙技的调用方不关怀妙技背后是Playwright、Appium如故Requests。
它只关怀妙技的名字和参数。
这就好比你在写业务代码时调用一个函数,你无论这个函数是用Go写的如故Python写的。
是以咱们需要的不是调和的推论引擎,而是调和的妙技注册表 + 动态调遣器。
我的框架干的便是这件事。
三、中枢计制拆解:Skill综合 + 注册中心 + 动态调遣
先看架构图。

拆解三个中枢计制。
机制一:Skill界说标准 - 让每个妙技自描绘
一个Skill的最小界说:
@register_skill("click")
def skill_click(selector: str, timeout: int = 5, **context):
"""点击指定元素,赈济Web/App调和selector"""
driver = context["driver"] # 由调遣器注入
# driver可能是Playwright的Page,也可能是Appium的WebElement
driver.click(selector, timeout=timeout)
牛牛游戏中国2026世界杯官网但这么还不够。每个底层驱动的API不同。
是以的确的Skill杀青是一个适配器:
class ClickSkill(BaseSkill):
name = "click"
parameters = {"selector": str, "timeout": int}
def execute(self, params, context):
driver = context["driver"]
if driver.__class__.__name__.startswith("Playwright"):
driver.locator(params["selector"]).click(timeout=params["timeout"])
elif driver.__class__.__name__.startswith("Appium"):
driver.find_element(AppiumBy.XPATH, params["selector"]).click
# 接口层不赈济click,调用会报错
要道点: 妙技里面知说念现时driver是什么类型,我方作念适配。
调用方完好意思毋庸管。
机制二:注册中心 - 妙技的商场
统统妙技启动时注册到中心。
注册表重视一个字典:skill_name -> SkillClass。
调遣器收到调用申请后,去注册表找妙技,LOL比赛下注2026中国官网入口实例化,调用execute。
刚正:
新增妙技不需要修改调遣器代码。
团队不错分享妙技库,比如login_with_retry、wait_for_toast。
机制三:动态调遣 - 一套DSL跑通统统端
调遣器选择两种输入:
YAML/JSON序列:顺应要道字驱动
Python链式调用:顺应代码立场
一个YAML用例示例:
name: 跨端下单历程
skills:
-name:navigate
params:{url:"https://xxx.com"}
-name:click
params:{selector:"#add-to-cart"}
-name:wait_for_element
params:{selector:".cart-badge",timeout:5}
-name:http_post
params:{url:"/api/checkout",data:{"item_id":123}}
-name:assert_status_code
params:{expected:200}
这个用例不错在Web环境跑(navigate, click),也不错在纯接口环境跑(http_post, assert_status_code)。
调遣器会左证现时注册的妙技网络,跳过不能用的妙技(如click在接口环境自动跳过并报警)。
中枢盘算推算形而上学:
妙技是原子武艺,用例是妙技的有序组合。
底层驱动不错换,妙技不错增删,但用例结构不变。
四、典型案例对比:吞并个场景,三种终局,一套写法
拿“登录并校验”这个场景例如。
传统容貌:三套代码
Web端:
page.goto("/login")
page.fill("#username", "test")
page.fill("#password", "pass")
page.click("button")
page.wait_for_selector(".welcome")
assert page.text_content(".welcome") == "接待"
App端(类似,但API不同):
driver.find_element(By.ID, "username").send_keys("test")
driver.find_element(By.ID, "password").send_keys("pass")
driver.find_element(By.ID, "login_btn").click
wait = WebDriverWait(driver, 5)
wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "welcome")))
assert driver.find_element(By.CLASS_NAME, "welcome").text == "接待"
接口端:
resp = requests.post("/login", json={"user": "test", "pwd": "pass"})
assert resp.status_code == 200
assert "接待" in resp.text
Skills框架容貌:一套用例
skills:
-name:navigate
params:{url:"/login"}
-name:input_text
params:{selector:"#username",text:"test"}
-name:input_text
params:{selector:"#password",text:"pass"}
-name:click
params:{selector:"button"}
-name:wait_for_element
params:{selector:".welcome",timeout:5}
-name:assert_text
params:{selector:".welcome",expected:"接待"}
把这个YAML丢给调遣器,斥地driver_type=web,跑Web。
斥地driver_type=app,跑App(惟有selector能被Appium解析)。
斥地driver_type=api,框架会自动将input_text和click革新为HTTP申请(要是杀青了对应映射)。
推行上,接口环境不需要填表单,是以咱们会为接口场景单独写一个更轻松的妙技序列。但要道在于:
测试东说念主员不需要记着三套API,只需要记着妙技名字和参数。
不错被截图传播的不雅点句:
测试框架的复杂度,应该由框架自己承担,而不是让每个用例编写者类似学习。
妙技调和,才是的确的钞票复用。不然你仅仅在不同的端里类似造轮子。
五、工程落地启示:你的测试钞票不该绑定在某种器具上
这个框架开源后,我还是在三个团队落地。
追忆三条最平直的教授。
启示一:把现存测试剧本拆成“妙技库”和“用例层”
不要一次性重写统统效例。
先从最常用的10个操作开动,注册成妙技。
然后让用例通过妙技调用来重构。
三个月后,你的用例文献会减少70%的类似代码。
启示二:妙技不错跨技俩分享
咱们在框架里内置了一个云尔妙技仓库。
团队A写的captcha_solver妙技,团队B不错平直拉下来用。
不需要复制代码,不需要知说念里面杀青。
这对中大型团队的价值极大:
你不再需要每个技俩齐配一个“自动化群众”。
启示三:新东说念主培训周期从两周压缩到两天
新东说念主只需要学会妙技列表和YAML写法。
不需要先学Playwright API,再学Appium,再学Requests。
他们不错在第一天就写出能跑的用例,第二天解析妙技背后的旨趣。
对在校生来说:
你目下不需要纠结“学Web自动化如故App自动化”。
你应该学的是“怎样综合测试妙技”。这个武艺在职何端齐通用。
对低级工程师来说:
试着把你往常写的Playwright剧本,重构为妙技+用例的格局。
你会发现我方开动从“写代码的东说念主”形成“盘算推算框架的东说念主”。
对中级工程师来说:
这个框架展示了怎样用“注册中心+适配器”模式解耦测试器具。
你不错把它扩展到你的团队,粗略我方杀青一个更轻量的版块。
六、问你的团队一个问题
去你团队的自动化代码仓库里,缺点找一个跨端的场景(比如用户从注册到下单)。
然后问我方:
要是未来要换掉其中一个底层框架(比如从Playwright换成Cypress),你要改若干处代码?
要是谜底是“提高10处”,
那么这个框架就值得你花一天时分究诘。
霍格沃兹测试开发学社LOL腾讯游戏平台,是一个专注软件测试、自动化测试、东说念主工智能测试与测试开发的技能相似社区