纯点工肯定不行的,但是我想要结合测试这方面提升一下自己开发技术。其实之前有短暂接触过前后端,自己有写过很简单的前后端分离的那种系统。特别的基础。后来误入测试,开发在我日常的工作中没有什么实践机会。我之前也看过前端代码,想着自己测试熟悉功能,能看代码然后学会写。但是怪我自己没坚持。有时候测试工作紧张。我下班后又不想多学会。时间一久就搁置了
我主要接触的就是每次的功能宣讲以及编写测试用例过程中的打磨这些,实际业务使用场景我其实接触的不同。但是通过我测试的这个应用有实施人员搭建出客户的实际使用场景。不过没有人会专门给我培训客户实际使用场景。这样的话,我是不是就需要自己去看一下客户的实际使用场景,然后再结合自己的测试用例,每一轮新功能测试完成后都按照这个方式去,慢慢的就能提升自己的业务能力呢
好的谢谢!
也感谢这位大佬的解答!
试了这个,果然不弹那个错误了,感谢大佬!!
但我还有一个疑惑。我自己新建的项目在微信开发者工具打开的时候,本地设置并没有加载启用数据预拉取选项。我想知道一下一般什么类型的项目会有这个加载项呢
我对比了一下这两个项目的 project.config.json 文件内容,发现显示启用数据预拉取选项的配置了"preloadBackgroundData": true,但是当我删除了"preloadBackgroundData": true,,清除缓存,再重新打开这个项目的时候,我发现本地设置还是显示启用数据预拉取选项。
1.我在微信开发者工具已经把 miniprogram-demo 这个项目调通了,多次运行 allure_debug.py 也是可以跑通那个 pytest-mini 插件示例的代码的,也就是你给出的https://github.com/zx490336534/pytest-mini/tree/main/demo链接
2.但是我执行那个 allure_debug.py 的时候,还总是会有超时提示,你之前实践的时候有明确配置允许连接微信开发工具的超时时间吗?可以明确避免 call App.callWxMethod] receive from remote timeout 问题
3.你提到的 npm run init 应该是指在调通 miniprogram-demo 小程序项目过程的时候执行的命令吗?这和执行 pytest-mini 下的 demo 脚本有什么关系呢
Plugin: helpconfig, Hook: pytest_cmdline_parse
ConftestImportFailure: TypeError: plugins() got an unexpected keyword argument 'timeout' (from D:\auto_test\miniprogramtest\cases\conftest.py)
For more information see https://pluggy.readthedocs.io/en/stable/api_reference.html#pluggy.PluggyTeardownRaisedWarning
config = pluginmanager.hook.pytest_cmdline_parse(
ImportError while loading conftest 'D:\auto_test\miniprogramtest\cases\conftest.py'.
Generating report to temp directory...
��ֹ�����������(Y/N)? �
多次执行的时候还会出现这个问题,还有乱码出现,已经设置了 pycharm 的编码为 UTF-8,同时也重启了服务,但是还是乱码显示
好的,谢谢!!
执行 allure_debug.py 文件时,控制台一直提示
test_home.py:4 test_view_container - TypeError: 'module' object is n…INTERNALERROR> Traceback (most recent call last):
能提供一下解决方案吗?感谢!!
加 1,卡在自动化这,没有太明显进度。希望有人能给指导一下
请教一下反向有哪些场景呢?没做过这块的测试,想了解一下
同求!!
以下是基于 Cursor + 自动化截图对比 的快速实施方案,可在 4 小时内搭建完整流程:
安装核心工具链
npm install playwright playwright-extra pixelmatch fs-extra
pip install Pillow opencv-python numpy
# 二、基础脚本开发(30 分钟)
async function captureScreenshots(urls, outputDir) {
const browser = await chromium.launch();
const context = await browser.newContext({
viewport: { width: 1280, height: 720 }
});
for (const [index, url] of urls.entries()) {
const page = await context.newPage();
await page.goto(url);
await page.waitForLoadState('networkidle');
// 核心截图逻辑
await page.screenshot({
path: ${outputDir}/screenshot_${index}.png
,
fullPage: true,
animations: 'disabled'
});
}
await browser.close();
}
// 示例调用
captureScreenshots(
['http://old-editor/doc/123', 'http://new-editor/doc/123'],
'./screenshots'
);
def compare_images(old_path, new_path, diff_path):
old_img = Image.open(old_path).convert('RGB')
new_img = Image.open(new_path).convert('RGB')
# 智能对比算法
diff = ImageChops.difference(old_img, new_img)
diff_array = np.array(diff)
# 差异可视化增强
_, threshold = cv2.threshold(
cv2.cvtColor(diff_array, cv2.COLOR_RGB2GRAY),
25, 255, cv2.THRESH_BINARY
)
contours, _ = cv2.findContours(
threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
# 生成差异标注图
result = cv2.imread(new_path)
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(result, (x,y), (x+w,y+h), (0,0,255), 2)
cv2.imwrite(diff_path, result)
return len(contours) > 0
document.querySelectorAll('.timestamp, .ads').forEach(el => el.remove());
});for (const device of devices) {
const deviceSpec = playwright.devices[device];
const context = await browser.newContext(deviceSpec);
// ...截图逻辑...
}
文档列表准备
mongoexport --uri=mongodb://localhost:27017/docs --collection=articles --fields=_id --type=csv > docs.csv
并行执行命令
cat docs.csv | xargs -P 8 -I {} node capture.js --docId {}
差异报告生成
from dominate import document
from dominate.tags import *
with document(title='Diff Report') as doc:
h1('Content Diff Report')
for diff in diffs:
div(img(src=diff['old']), img(src=diff['new']), img(src=diff['diff']))
with open('report.html', 'w') as f:
f.write(doc.render())
优化策略 实施方法 效果提升
智能缓存 对未修改文档跳过截图 减少 60% 工作量
增量对比 仅对比修改时间>上次运行的文档 缩短 70% 时间
GPU 加速 启用 playwright._impl._driver_process GPU 支持 提速 3x
分布式 使用 K8s Job 分片处理 线性扩展
# 六、灰度验证策略
影子模式对比
// 同时加载新旧编辑器进行实时对比
async function shadowCompare(docId) {
const [oldPage, newPage] = await Promise.all([
browser.newPage().goto(oldUrl),
browser.newPage().goto(newUrl)
]);
const [oldShot, newShot] = await Promise.all([
oldPage.screenshot(),
newPage.screenshot()
]);
return compare(oldShot, newShot);
}
渐进式验证
第一阶段 → 对比核心文档(1000 篇)
第二阶段 → 对比模板文档(所有模板类型)
第三阶段 → 全量文档滚动对比
# 七、操作成本对比
方案 5000 文档耗时 准确率 硬件成本
人工抽查 40 人天 65% 0
文本对比 2 小时 92% 低
截图对比 25 分钟 98% 中
通过该方案,可实现每小时验证 12,000+ 文档 的视觉一致性。建议结合文本对比方案使用,先执行快速文本对比,再对存在差异的文档进行精准截图对比。
以上步骤如果楼主执行了,请反馈一下。以上答案是问的 deepseek.我没有具体的系统场景,所以想了解一下最终问题是否有效解决!
点赞
谢谢大家的建议,我先调研一下 airtest 和 minium,Appium+chrimedriver 这三种哪种更适合我的小程序测试。和研发确认了一下,小程序并非微信纯原生开发。是使用的 H5 套壳微信小程序。如果大家有更合适的建议,可以提出。谢谢!!
感谢!我试一下的。
学到了。感谢!
感谢提醒。已移除这个 raise 添加了更具体的 except Exception 语句替换
还真的是。我用了 span 就能成功定位了。但是按理来说 id 应该是最唯一可以定位的呀。怎么这里用 span 就行了呢。求大佬顺带答惑一下。感谢!!
关于上边提到的 firebug 和 firepath。我进行相关资料搜索发现自 Firefox 59 发布以来,Firebug 已经不再被官方支持或维护。想请教一下楼主是降了 Firefox 的版本。还是有了别的替代插件呢?