影刀RPA 自动化测试入门:用RPA做接口和界面回归测试
影刀RPA 自动化测试入门用RPA做接口和界面回归测试作者林焱写在前面影刀RPA不只能做数据采集和办公自动化还能做自动化测试。对于没有专职QA团队的小团队来说用影刀搭建一套轻量的接口界面回归测试成本极低效果明显。本文讲清楚两类测试的搭建方法接口自动化测试验证后端接口正确性和界面自动化测试验证前端页面交互。一、接口自动化测试拼多多店群自动化报活动上架测试框架思路importrequestsimportjsonimportdatetimeclassApiTestRunner:简单的接口测试框架def__init__(self,base_url,auth_tokenNone):self.base_urlbase_url self.headers{Content-Type:application/json}ifauth_token:self.headers[Authorization]fBearer{auth_token}self.results[]defrun_test(self,test_name,method,path,payloadNone,expected_status200,expected_fieldsNone,expected_valuesNone): 执行单个接口测试 expected_fields: 期望响应中存在的字段列表 expected_values: 期望的键值对如 {code: 0, message: success} urlf{self.base_url}{path}try:ifmethod.upper()GET:resprequests.get(url,headersself.headers,paramspayload)elifmethod.upper()POST:resprequests.post(url,headersself.headers,jsonpayload)elifmethod.upper()PUT:resprequests.put(url,headersself.headers,jsonpayload)elifmethod.upper()DELETE:resprequests.delete(url,headersself.headers)result{test_name:test_name,url:url,method:method,status_code:resp.status_code,response_time_ms:round(resp.elapsed.total_seconds()*1000),passed:True,errors:[]}# 检查状态码ifresp.status_code!expected_status:result[passed]Falseresult[errors].append(f状态码期望{expected_status}实际{resp.status_code})# 解析响应try:resp_dataresp.json()except:resp_data{}ifexpected_fieldsorexpected_values:result[passed]Falseresult[errors].append(响应不是有效JSON)# 检查字段存在ifexpected_fields:forfieldinexpected_fields:iffieldnotinresp_data:result[passed]Falseresult[errors].append(f响应缺少字段{field})# 检查字段值ifexpected_values:forkey,expected_valinexpected_values.items():actual_valresp_data.get(key)ifactual_val!expected_val:result[passed]Falseresult[errors].append(f字段{key}期望{expected_val}实际{actual_val})result[response_body]str(resp_data)[:500]# 记录部分响应exceptExceptionase:result{test_name:test_name,url:url,method:method,passed:False,errors:[str(e)],response_time_ms:0,response_body:}self.results.append(result)status✅ PASSifresult[passed]else❌ FAILprint(f{status}[{result.get(response_time_ms,0)}ms]{test_name})ifnotresult[passed]:forerrinresult[errors]:print(f ↳{err})returnresultdefgenerate_report(self,output_filetest_report.xlsx):生成测试报告importopenpyxlfromopenpyxl.stylesimportPatternFill,Font wbopenpyxl.Workbook()wswb.active ws.title测试结果# 统计totallen(self.results)passedsum(1forrinself.resultsifr[passed])failedtotal-passed ws.append([测试报告,f生成时间{datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)}])ws.append([f总用例{total},f通过{passed},f失败{failed}])ws.append([])ws.append([测试名称,请求方法,URL,状态码,响应时间(ms),结果,错误信息])green_fillPatternFill(start_color90EE90,fill_typesolid)red_fillPatternFill(start_colorFF6B6B,fill_typesolid)forresultinself.results:row[result[test_name],result.get(method,),result.get(url,),result.get(status_code,),result.get(response_time_ms,),PASSifresult[passed]elseFAIL,; .join(result.get(errors,[]))]ws.append(row)# 着色fillgreen_fillifresult[passed]elsered_fillforcellinws[ws.max_row]:cell.fillfill wb.save(output_file)print(f\n 测试报告已生成{output_file})print(f通过率{passed}/{total}({round(passed/total*100)}%))定义并执行测试用例# 初始化测试运行器runnerApiTestRunner(https://api.yourapp.com,auth_token你的token)# 用户模块测试runner.run_test(获取用户信息,GET,/api/user/profile,expected_status200,expected_fields[id,name,email],expected_values{code:0})runner.run_test(更新用户信息,PUT,/api/user/profile,payload{name:测试用户,phone:13800138000},expected_status200,expected_values{code:0,message:更新成功})# 订单模块测试runner.run_test(创建订单,POST,/api/orders,payload{product_id:PROD_001,quantity:2,address:北京市朝阳区xxx},expected_status201,expected_fields[order_id,status,created_at])runner.run_test(获取订单列表,GET,/api/orders,payload{page:1,size:10},expected_status200,expected_fields[total,items])# 边界条件测试runner.run_test(越权访问测试,GET,/api/admin/users,expected_status403# 期望返回403禁止访问)runner.run_test(无效参数测试,POST,/api/orders,payload{product_id:,quantity:-1},expected_status400# 期望返回400参数错误)# 生成报告runner.generate_report(api_test_report.xlsx)二、界面自动化测试界面测试核心方法importpyautoguiimporttimeclassUITestRunner:界面自动化测试框架def__init__(self):self.results[]pyautogui.FAILSAFETruepyautogui.PAUSE0.3deffind_element(self,image_file,timeout10,confidence0.85):等待并查找界面元素starttime.time()whiletime.time()-starttimeout:locationpyautogui.locateOnScreen(image_file,confidenceconfidence)iflocation:returnlocation time.sleep(0.5)returnNonedefclick_element(self,image_file,test_step,timeout10):点击界面元素locationself.find_element(image_file,timeout)iflocation:pyautogui.click(pyautogui.center(location))returnTrueprint(f⚠️ 步骤失败{test_step}- 未找到元素{image_file})returnFalsedefinput_text(self,image_file,text,clear_firstTrue):在输入框中输入文本locationself.find_element(image_file)iflocation:pyautogui.click(pyautogui.center(location))ifclear_first:pyautogui.hotkey(ctrl,a)pyautogui.typewrite(text,interval0.05)returnTruereturnFalsedefverify_text_visible(self,expected_text,screenshotNone):验证文字是否在界面上可见OCR识别# 使用影刀的OCR指令或pytesseracttry:importpytesseractfromPILimportImageifscreenshotisNone:screenshotpyautogui.screenshot()text_foundpytesseract.image_to_string(screenshot,langchi_simeng)returnexpected_textintext_foundexceptImportError:# 如果没有tesseract用图像匹配替代print(提示安装pytesseract可以做更精确的文字识别)returnFalsedefrun_test_case(self,test_name,test_func):执行测试用例并记录结果print(f\n▶ 执行测试{test_name})start_timetime.time()try:successtest_func()elapsedround((time.time()-start_time)*1000)result{name:test_name,passed:success,time_ms:elapsed,error:}print(f{✅ PASSifsuccesselse❌ FAIL}[{elapsed}ms])exceptExceptionase:elapsedround((time.time()-start_time)*1000)result{name:test_name,passed:False,time_ms:elapsed,error:str(e)}print(f❌ ERROR [{elapsed}ms]:{e})# 截图保存错误现场pyautogui.screenshot(ftest_error_{test_name}_{int(time.time())}.png)self.results.append(result)returnresult[passed]示例登录功能回归测试ui_runnerUITestRunner()deftest_login_success():测试正常登录流程# 点击登录按钮ifnotui_runner.click_element(login_btn.png,点击登录按钮):returnFalsetime.sleep(1)# 输入用户名ifnotui_runner.input_text(username_field.png,testexample.com):returnFalse# 输入密码ifnotui_runner.input_text(password_field.png,Test12345):returnFalse# 点击确认ifnotui_runner.click_element(submit_btn.png,点击提交):returnFalsetime.sleep(2)# 验证登录成功检查首页元素是否出现dashboardui_runner.find_element(dashboard_title.png,timeout10)returndashboardisnotNonedeftest_login_with_wrong_password():测试错误密码时的提示ifnotui_runner.click_element(login_btn.png,点击登录):returnFalseui_runner.input_text(username_field.png,testexample.com)ui_runner.input_text(password_field.png,wrongpassword)ui_runner.click_element(submit_btn.png,提交)time.sleep(1)# 检查是否出现错误提示error_msgui_runner.find_element(error_message.png,timeout5)returnerror_msgisnotNone# 执行测试套件ui_runner.run_test_case(正常登录,test_login_success)ui_runner.run_test_case(错误密码登录,test_login_with_wrong_password)# 打印结果passedsum(1forrinui_runner.resultsifr[passed])print(f\n 测试完成 )print(f通过{passed}/{len(ui_runner.results)})三、持续集成每次发版前自动运行测试在影刀中创建一个定时任务在每次发布前比如下午5点自动运行测试套件importsubprocessimportsmtplibfromemail.mime.multipartimportMIMEMultipartfromemail.mime.baseimportMIMEBasefromemailimportencodersdefrun_all_tests_and_notify():运行所有测试并通过邮件发送报告print(开始执行自动化测试套件...)# 执行接口测试runnerApiTestRunner(https://api.yourapp.com,token)# ... 定义所有用例 ...runner.generate_report(api_report.xlsx)totallen(runner.results)passedsum(1forrinrunner.resultsifr[passed])# 发送邮件通知ifpassedtotal:subjectf⚠️ 自动化测试失败 -{passed}/{total}通过else:subjectf✅ 自动化测试全通过 -{total}/{total}# 通过影刀邮件指令或Python smtplib发送print(f测试完成{subject})run_all_tests_and_notify()TEMU店群矩阵自动化运营核价报活动四、踩坑记录坑1图像识别受分辨率和缩放影响UI测试用的图片素材必须在测试运行的机器上截取屏幕缩放比例125%/150%会导致图像匹配失败。建议将系统缩放设为100%来截图。坑2测试环境数据污染自动化测试会创建测试订单、测试用户等数据。需要有专门的测试环境或测试完毕后清理数据不要在生产环境跑测试。坑3界面测试速度太慢界面测试比接口测试慢10-20倍。全量界面回归建议在凌晨离峰时间执行平时只执行核心路径冒烟测试。坑4弹窗和loading遮挡页面加载动画或意外弹窗会导致元素找不到。在关键操作后加time.sleep(2)或等待loading消失再继续。总结用影刀做自动化测试的核心价值不需要专职QA发版前10分钟自动跑完回归测试有问题立即通知。接口测试优先快、准、稳界面测试补充核心流程。署名林焱

相关新闻

AI论文写作工具PaperXie:智能选题与格式自动化实战

AI论文写作工具PaperXie:智能选题与格式自动化实战

1. 论文写作痛点与工具革新本科毕业论文堪称学术生涯的第一道"修罗场",选题方向模糊、格式规范繁琐、文献管理混乱这三大痛点,每年都让数百万学子在图书馆熬夜爆肝。我带的毕业设计小组里,90%的学生前两周都在和页眉页脚较劲&#…

2026/7/24 8:39:50 阅读更多 →
LocalAI本地化LLM部署与优化实战指南

LocalAI本地化LLM部署与优化实战指南

1. LocalAI LLM 集成方案概述LocalAI作为开源本地化AI解决方案的代表,正在改变中小团队部署大语言模型的方式。这个方案最吸引人的特点是它能在消费级硬件上实现OpenAI API兼容的LLM服务,让开发者无需依赖云端API即可构建AI应用。我在实际项目中验证过&a…

2026/7/24 8:39:50 阅读更多 →
Datadog Temper与Claude Code:AI智能体开发的运行时监控与调试实践

Datadog Temper与Claude Code:AI智能体开发的运行时监控与调试实践

在AI智能体开发领域,Claude Code作为新兴的开发工具,正逐渐改变我们构建和调试代码的方式。然而,开发者在实际使用过程中经常面临工具集成度低、调试效率不高等痛点。Datadog作为业界领先的监控平台,最近推出的"Temper"…

2026/7/24 8:39:50 阅读更多 →

最新新闻

计算机视觉与深度学习在人体无感定位中的应用

计算机视觉与深度学习在人体无感定位中的应用

1. 项目概述:人体无感定位技术的革新意义在智能感知领域,我们正经历一场从"主动交互"到"无感识别"的技术跃迁。传统定位技术如GPS、蓝牙信标等需要用户携带设备或主动配合,而人体无感定位技术通过计算机视觉与深度学习&a…

2026/7/24 8:46:53 阅读更多 →
ABAP RSA加密解密与签名验签实战:标准函数与OpenSSL互操作指南

ABAP RSA加密解密与签名验签实战:标准函数与OpenSSL互操作指南

1. 项目概述:当ABAP遇见RSA在SAP的ABAP世界里处理数据安全,尤其是与外部系统对接时,RSA非对称加密是一个绕不开的话题。你可能遇到过这样的场景:需要将SAP里的关键业务数据(比如订单金额、客户信息)安全地传…

2026/7/24 8:46:53 阅读更多 →
MSPM0 MCU子系统设计:如何用硬件集成与自动化降低嵌入式开发成本

MSPM0 MCU子系统设计:如何用硬件集成与自动化降低嵌入式开发成本

1. 项目概述:当MCU设计遇上成本与效率的双重挑战在嵌入式硬件开发的日常里,我们这些工程师最常面对的,恐怕就是如何在有限的预算和紧张的板面空间内,实现尽可能多的功能。老板要成本低,产品经理要功能全,硬…

2026/7/24 8:46:53 阅读更多 →
AI智能体Tool Calling错误处理与重试策略实践

AI智能体Tool Calling错误处理与重试策略实践

1. 项目概述在AI智能体(Agentic)系统的开发中,Tool Calling(工具调用)功能是连接智能体与外部环境的关键桥梁。当系统需要执行超出其原生能力范围的操作时,比如查询数据库、调用API或操作外部设备&#xff…

2026/7/24 8:46:53 阅读更多 →
科颜氏面霜包材定制厂家不敢说的内幕:模具公差0.02mm和双密封结构才是复购护城河

科颜氏面霜包材定制厂家不敢说的内幕:模具公差0.02mm和双密封结构才是复购护城河

拿着某北美实验室级高保湿霜的包材照片来找源头工厂做定制,结果一上架就被客户投诉“瓶盖拧不紧”、“膏体表面发黄”?别急着骂渠道商,问题八成出在包材的模具精度和密封结构上。干美妆代工十几年,我天天跟这些瓶瓶罐罐打交道&…

2026/7/24 8:46:52 阅读更多 →
丰益捷酒店RFID固定资产管理方案:从技术架构到落地实践——四川成都某酒店全流程案例

丰益捷酒店RFID固定资产管理方案:从技术架构到落地实践——四川成都某酒店全流程案例

技术标签:RFID|固定资产管理|酒店行业|系统架构|手持盘点|全生命周期管理 适用读者:系统集成工程师、酒店IT负责人、RFID方案选型人员、数字化转型决策者摘要 酒店行业固定资产具有品类庞杂、分…

2026/7/24 8:45:52 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻