2
澳门人威尼斯中国官网登录入口
热点资讯
威尼斯人 你的位置:澳门人威尼斯中国官网登录入口 > 威尼斯人 > 澳门人·威尼斯官网(中国)登录入口 开源一套通用测试Skills框架: 复旧Web/App/接口调解技巧调用
澳门人·威尼斯官网(中国)登录入口 开源一套通用测试Skills框架: 复旧Web/App/接口调解技巧调用 发布日期:2026-06-09 02:14    点击次数:99

澳门人·威尼斯官网(中国)登录入口 开源一套通用测试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)

但这么还不够。每个底层驱动的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。

窜改器收到调用苦求后,去注册表找技巧,澳门人威尼斯中国官网登录入口实例化,调用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剧本,重构为技巧+用例的方法。

2026世界杯中国滚球app官网

你会发现我方初始从“写代码的东谈主”形成“瞎想框架的东谈主”。

对中级工程师来说:

这个框架展示了如何用“注册中心+适配器”模式解耦测试器具。

你不错把它引申到你的团队,大要我方收尾一个更轻量的版块。

六、问你的团队一个问题

去你团队的自动化代码仓库里,顶住找一个跨端的场景(比如用户从注册到下单)。

然后问我方:

若是未来要换掉其中一个底层框架(比如从Playwright换成Cypress),你要改几许处代码?

若是谜底是“擢升10处”,

那么这个框架就值得你花一天时候盘考。

霍格沃兹测试开辟学社澳门人·威尼斯官网(中国)登录入口,是一个专注软件测试、自动化测试、东谈主工智能测试与测试开辟的技艺换取社区