【.com原稿】前言2014年苏宁发票中心系统接入增值税电子普通发票、增值税专用发票、增值税普通发票、增值税开具普通发票(卷式)等四种发票。从业务上看,收线上电商、零售云、金融、茂宁、当当、天猫配送、苏宁有方、北京节能补贴、政企业务、香港票据、电商产能输出、苏宁一卡通、大润发、卜蜂莲花、速鲜生等订单并提供结算服务。自动化解决方案俗话说,大问题创造大智慧;那么,我们来谈谈为什么要自动化?前言中提到的苏宁发票中心计费系统,负责苏宁集团内部和外部的所有业务计费服务。对于下游N个业务和系统,当相关系统开发新功能时,开票中心不变,但往往需要配合联测提供开票服务,各种数据时常配合联测。这花费了团队大量的时间和精力。比如某项目开票匹配测试,因为增值税和普通发票开具需要定位数据是否已经接收,然后检查数据是否满足开票条件,然后执行定时任务等待打开、锁定、开发票和邮寄导入。对于上述这么多的操作步骤,我们都做了计算。人工出票平均耗时6分钟。项目集中联测周期约3天,共需开具100多张发票,消耗100(张)测试资源*6(min/张)/60(min)/8(人)-day)=1.25人-天,也就是说,如果完全自动化,没有测试人员的介入,2分钟内可以完成单张发票的开具,并且在联测周期内***可以节省总测试人日的42%。为提高联测效率、释放团队资源、提升测试专注度,解决该问题已迫在眉睫。我们设计的更好的解决方案是什么?有什么好处?有人会说,MOCK,N年前就存在的问题解决方法!真的很难满足复杂的业务场景和真实数据的处理。一句话,风险大,容易歪曲。以发票中心为例,上游系统下载真实的测试数据,我们需要对请求开票的数据的税率、会员、支付、收款状态进行判断处理。前文提到,复杂的流程需要根据实际的计费环节来实现,这也是集成测试的基本要求之一,不宜使用MOCK方式。同时,发票中心还需要针对不同的来源系统和票种,进行数据合并或其他方式的处理。MOCK技术很难只实现一种合并功能。为了解决这个问题,通过相关人员的配合,秉承最大程度用机器代替人工干预的思路,利用团队现有的自动化技术,最终想出了一个比较好的和相对独立的解决方案。方案简述正面:为方便上游计费需求人员使用,采用Web页面进行数据录入,提供计费接口和计费结果查询接口;前端调用的开票结果查询接口;对接收到的数据进行数据分析、数据校验、MySQL数据查询、逻辑计算,然后对开票数据执行定时任务、调用IE开票、保存截图、写入日志等操作,实现一个完整的开票流程。该方案的优点:1、通用性高。目前任何需要计费的上游项目都可以使用;2.门票类型和环境随意切换;3、问题定位反馈准确;4、最新的用户操作更简单直接。高效率;5、无需切换系统即可查看执行结果,查询更直观;6、测试人员基本零占用,人力资源基本零消耗。Web前端,vue.js结合元素组件创建一个极简界面,为开票人员提供查询接口,可以通过关键信息查询开票结果图片和开票明细日志。开票结果查询明细:将复杂的表单输入转化为三个简单的输入条件,流程执行日志、问题提示、错误信息、红色错误报告等一应俱全。通过简单的权限限制,为我们人员提供数据流转接口(计费人员不可见),方便统计和问题分析。Web、Python和Command的化学反应,简单的权限控制设计在局域网中,开关机、断网可能会导致IP变化,所以我们选择加入的计算机全名domain(也可以使用其他唯一标识,为了标识特定人员,所以我们选择加入domain的计算机的全名)作为权限控制的入口。Web通过axios将接口数据传给Python的flask,flask接收数据同时获取其请求ip,通过ip获取电脑全名(Windows下使用nbtstat命令,nmblookuplinux下使用command,Python也可以通过socket.getfqdn(ip)等方法使用),通过域名获取配置,确定请求者可以看到的页面(不配置则默认)页);并通过前端路由跳转,避免跳过权限检查直接访问地址。Python的逻辑判断和自动运行,像机器一样运行通过前端输入的三个条件,Python后台收到接口数据后,做出相关的业务判断,包括但不限于数据检查、数据校验、计费池检查,并通过requests接口自动执行定时任务并获取执行结果,以及一系列的自动判断。如果无法开票,则返回前端报错。如果可以开票,将获取的数据传输到selenium运行的IE浏览器计费接口,进行自动开票。为什么要用IE?开发票业务系统本身是设计的。开票时,通过ActiveX调用本地航信客户端开具发票。所以,ActiveX,你明白了。既然要调整本地客户端,是不是问题~是的,众多问题之一,我们排除了调用计费人员本地客户端的解决方案(安装客户端,设置IE,调用本地程序,等等,太复杂了)。第二,根据目前的业务量,我们选择使用Windows终端作为宿主,所有的代码部署和计费操作都在这台机器上完成。三、开票结束后,由于开票软件本身的安全限制,如果直接保存账单会丢失部分信息,所以选择使用pywinauto优化账单显示客户端,并全屏截图通过Python。第四,截图和日志一起保存在本机上,前端可以通过接口直接请求查看详情。五、拓展成长计划:如果使用linux部署web和python业务逻辑代码,实现linux和Windows命令和数据通过sockets传输,Windows性能机作为IE计费和账单截图的承载。一台性能机还可以承载单独的计费任务,实现并发计费请求。太乱了,咱不总结了。总体来说,进销存环节的自动化实现及解决过程如下:在Windows性能机上部署Python代码和Web代码,设置ip和端口,启动flask监控;开票人员可以通过相应的http地址访问开票页面,录入数据,开始开票;接口接收计费数据,通过Python后台逻辑处理,出现问题返回给前端。在本地,进程日志也记录在本地,计费日志记录在MySQL中;之后将计费结果返回给前端,实际计费人员可以通过相关信息查询账单图片和计费日志,管理人员可以使用计费日志进行相关的数据统计和管理工作。综上,到这里整个流程就结束了,基本解决了我们联测和计费的问题。自该工具上线以来,测试人员不再需要打断正在进行的新项目来配合计费,提高了项目成员自身的测试集中度,释放了约1.25人日/项目的项目协调人力和时间(约3人-单项目联测天数),计费效率提升近70%。我们提取了一段计费数据的执行日志明细,最直观地展示了复杂计费过程的效率:随着时间的推移,项目的迭代和工具的完善,收益会逐渐积累,真正的与开发票相结合的减负也开始出现。而Python技术在测试自动化中的应用,对这一切的实现起到了关键作用。下个版本的规划虽然我们这次已经实现了全链路自动开票的能力,但是从这次自助开票开始(2019.2.12)到完全实现(2019.3.11)只用了一个月的时间,还有很多工作项还没有上线,下个版本我们会加强几个功能:1.进销存服务能力的分析和优化;2、提升***的直接用户体验,使用方便高效;3、多终端、多线程的进销存支持能力建设;4.计费问题等自动处理机制。期待我们下一个更好的版本!作者简介钟崇瑞,苏宁科技集团员工平台研发中心高级测试经理,具有多年业务和产品设计经验及测试管理经验,负责集团财务核算、财务共享、税务核算及智能应用测试管理等工作工作涉及功能、性能、自动化、安全等测试领域,带领团队多次完成金融系统改造和切换测试工作,致力于打造苏宁金融自动化测试产品解决方案,打造高效便捷的测试应用产品。金业帅,苏宁科技集团员工平台研发中心测试开发工程师,负责测试工具产品的技术研究和实现,主要对接集团财务、共享、税务等系统的自动化,参与开发苏宁发票中心、财务中台等系统自动化测试开发工作。精通Python应用界面\后台\客户端开发,掌握Python和Java应用,MySQL/hive/ES等数据库调用技术和应用调优;在实施自动化测试框架的过程中,具有深入的分析设计能力和搭建经验。【原创稿件,合作网站转载请注明原作者和出处为.com】
