Python自动化测试框架怎么搭建?完整框架源码给到你
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
前言
背景公司需要每一个项目组都搭建自己的一套自动化测试框架编写测试用例用于完善公司的测试流程不限制形式。
核心技术栈testng+jenkins+maven+dubbo
开发人力180%
测试人力130%
耗时4个月左右
搭建过程
搭建过程大致分为4个阶段
一阶段
原始需求由工程效能组的同事提供一个封装了testng的j框架给每一个项目组用于编写自动化测试用例原本的意图是由开发配合测试同学编写代码用于完成自动化测试用例。于是按照这一需求本人开始编写代码完成测试用例。由于需求简单所以只编写简单的框架方便测试同学拷贝黏贴。起初由本人编写一些复杂的用例后续其他的用例由测试同学仿照我的用例进行编码完成剩余的测试用例。
结果表现
1,在实施的过程中发现重复逻辑过多
2工程效能组提供的框架太简陋
3最重要的问题可以说绝大多数的测试同学看不懂代码更不要说编码能力如何这几乎为零导致测试用例无法编写压力全部由开发承担且不易于维护。
二阶段
更改需求由本项目组架构师提出我们内部自行更改需求具体表现为让测试同学不再编写代码通过配置驱动完成测试用例。此时由于未曾有过这方面的经验虽然完成功能但是效果并不理想
结果表现
1测试同学能够开始编写测试用例
2配置凌乱且过多
三阶段
优化二阶段的成果具体如下
1全面优化二阶段配置减少配置文件减少不必要的配置项
2完善框架功能修复bug
3优化代码
结果表现
1用例配置文件减少配置项减少测试同学编写用例速度大幅提升
2根据测试同学提供的反馈信息进一步完善功能
3不断优化代码便于维护
四阶段
进一步需求由于测试用例以配置驱动但jenkins服务器无法直接上传配置文件所以提供web项目辅助测试同学
结果表现
1测试同学可自行编写测试用例上传到jenkins服务器
2测试同学可通过web项目自行校验测试用例是否编写正确便于修改
下面具体的说一下搭建过程
接口类
1调用接口前需要做数据的植入
2调用接口前需要做配置的变更
3调用接口
4恢复配置
5删除植入的数据
一阶段
第一个阶段其实做的事情比较简单主要分为2个第一个是需求分析第二个是硬编码
1需求分析
根据需求先分析项目组多个系统发现基本归于2类一类是接口一类是定时任务。接口和定时任务分为多种需要分类
接口的校验分2种一种是校验返回结果的一种是校验落库数据的。这个又可以细分比如一个接口入参不同返回结果不同此为一个接口多个场景等。
定时任务的校验分2种一种是校验落库数据的一种是校验生成文件的。
2硬编码
根据需求分析先编写接口类测试用例其中就是硬编码。
分析在这个阶段主要是基于testng进行编写测试用例基本是硬编码由jenkins执行生成报告。
1工程效能组同事提供的框架只支持csv格式的入参和硬编码入参非常不好用。
2连接数据库使用jdbc需要自己二次封装。
3框架中无常用开发框架如spring,mybatis等
4由于公司有防火墙及各种客观硬件原因导致如果框架中引入spring会导致jenkins在运行过程中耗时极其严重不得不放弃使用spring等框架
5由硬编码写出大概10个接口的部分场景积累了经验
主要问题与难点
1框架提供的接口入参不好用
2编写代码过多不易于维护
解决方案
1自行开发json文件入参xml文件入参等功能
二阶段
根据新的需求使用配置驱动后参考的模型为tomcat。
简单分析一下
tomcat是我们比较常用的一个web服务器它是以修改配置文件来完成我们所需要的功能的但是我们一般简单使用的话就是修改一下端口不过tomcat仍提供大量配置供我们修改用于完成我们的需求基于这一特性我们需要制定一套规则
1配置驱动
2提供可选配置如果用户不配置那么以默认的配置为主如果用户配置以用户的配置为主
3自定义一套规则以properties文件的形式来驱动
分析
1properties文件只能配置简单的key-value如果完成复杂的配置则无能为力
2规则太繁琐
主要问题与难点
1以配置驱动一个用例中含有多个接口多个接口间有参数依赖关系比如一个CASE含有N个接口A接口的入参有一个属性是C接口的入参B接口的出参有一个属性是C接口的入参ABC有顺序执行关系在配置中如何体现
2如何以配置驱动完成校验规则
解决方案由于已废弃后面详述
1自定义传参的规则
2自定义校验规则
Python自动化测试视频教程2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华学完年薪40W+_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1AF411T7qJ/?spm_id_from=333.999.0.0
三阶段
此时在二的成果上进行优化全面修改规则目标
1配置少而精
分析
1由于properties文件无法编写复杂规则放弃properties文件,
2二阶段的问题一个CASE中N个接口相互依赖或独立如何在配置中体现
3校验规则策略问题
解决方案
1使用xml文件代替
具体实现
1自定义xml文件以CASE的名字命名可自定义
2xml文件格式大致如下很多配置记不清楚了基本的如此
<?xml version="1.0" encoding="ISO-8859-1"?>
<testcase id="0" name="xxx">
<!--第一组接口-->
<group id="0" name="xxx-1">
<!--DUBBO接口全路径必须配置-->
<service>com.xxx.service</service>
<!--DUBBO接口入参全路径可不配置可通过反射获取基于一个服务一个方法一个入参一个出参若配置了以配置的为主-->
<request>com.xxx.request</request>
<!--DUBBO接口出餐全路径可不配置可通过反射获取基于一个服务一个方法一个入参一个出参若配置了以配置的为主-->
<response>com.xxx.response</response>
<!--DUBBO接口方法可不配置可通过反射获取基于一个服务一个方法一个入参一个出参若配置了以配置的为主-->
<method>method</method>
<!--DUBBO接口入参json串必须配置-->
<data>
{
"key":"value"
“key1”:"value",
}
</data>
<!--DUBBO接口预计出参可不配置可默认就是此配置此处仅校验返回码和message若配置了以配置的为主-->
<returnDate>
{
"code":"00",
"message":"成功"
}
</returnDate>
<!--DUBBO接口校验策略可不配置默认为此类型校验策略若配置了以配置的为主-->
<strategy>default</strategy>
</group>
<!--第二组接口以下为最简配置-->
<group id="1" name="xxx-2">
<!--DUBBO接口全路径必须配置-->
<service>com.xxx.service</service>
<!--DUBBO接口入参json串-->
<data>
{
"key":"value"
}
</data>
</group>
<!--第三组接口-->
<group id="2" name="xxx-3">
<!--DUBBO接口全路径必须配置-->
<service>com.xxx.service</service>
<!--DUBBO接口入参json串,此处自定义规则传递参数group.0代表id=0的grouprequest代表入参key代表入参中的属性名-->
<data>
{
"key":"#{group.0.request.key}",
"key1":"#{group.1.response.key}",
}
</data>
</group>
</testcase>
以上xml配置可完成一个CASE有N组接口每组接口都相互有自己的入参出参校验策略等相互不受影响也可以相互依赖相互传参且有序。
2校验的配置配置文件参考mybatis的配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.jfpointscore.dao.UserMapperXml" >
<!--校验接口一般就是2种
1校验接口返回的字段是否正确
2校验接口完成请求后落库数据是否正确
-->
<!--自定义标签由测试编写SQL自定义校验dubbo接口返回字段值或落库数据
id为唯一表示group与配置中的group相关联达到N组接口N个SQL相互不影响且有序
-->
<sql id="0" group="0">
select a.id as "id" from table a where a.name='张三'
</sql>
<select id="getUserList" resultMap="BaseResultMap" >
SELECT
<include refid="Base_Column_List" />
FROM tb_user
</select>
<select id="getUserById" parameterType="java.lang.Integer" resultMap="BaseResultMap" >
SELECT
<include refid="Base_Column_List" />
FROM tb_user
WHERE id = #{id}
</select>
<insert id="add" parameterType="com.jfpointscore.entity.core.User" >
INSERT INTO
tb_user
(username,age,ctm)
VALUES
(#{username}, #{age}, now())
</insert>
<update id="update" parameterType="java.util.Map" >
UPDATE
tb_user
SET
username = #{user.username},age = #{user.age}
WHERE
id = #{id}
</update>
<!--#{id} 代表传参由于某些SQL需要DUBBO接口返回的结果作为参数故此设计parameterType代表参数类型等可自定义设计
-->
<delete id="delete" parameterType="java.lang.Integer" group="0" >
DELETE FROM
tb_user
WHERE
id = #{id}
</delete>
</mapper>
3properties文件
properties文件是属于key-value形式用于处理一些CASE运行前后需要变更的配置
4由于在一个CASE运行前后可能需要做一些数据的植入和删除动作故仿照2中的配置自定义一套数据植入删除的sql配置
5参数传递问题这是由于testng运行决定的可自行百度。
在参数传递问题上的问题在于以上配置有参数传递那么代码运行完了参数到哪里去拿比如A接口运行完了B接口运行完了C接口要拿A接口的出参字段到哪里去拿代码已经跑完了啊没有了啊
我的解决方案是
1在CASE运行前把所有的入参记录到临时properties文件中
2在每一个接口运行后把出参记录到临时properties文件中
3每一个接口逇入参和出参都用UUID做唯一标识则可以区分出一个接口完整的入参和出参
4记录在临时文件中不会丢失但是要记住有文件回收功能不然文件会越来越大可参考log日志框架的日志回收功能以天为单位回收N天前的临时文件。
四阶段
提供web功能进行辅助不详述了就是后台管理系统
1需要注意必须要把之前的逻辑提取出来保证web的逻辑和jenkins的逻辑是一致的这个就看代码写的好不好了
定时任务类一般是校验落库数据和生成的文件
分析
1触发定时任务之前需要数据的植入
2触发定时任务之前需要触发N个相互依赖或不依赖的接口触发接口之前需要修改接口配置触发完成后需要恢复配置
3触发定时任务之前需要修改定时任务配置
4触发完成之后需要恢复配置
5触发完成后需要删除植入的数据
6触发完成后需要校验落库数据
7触发完成后需要校验生成文件的内容
解决方案
1接口部分沿用之前接口的配置落库部分沿用之前的校验配置
2文件部分采用远程登录linux服务器到文件成功路径使用linux命令搜索文件内容
简单配置如下
<?xml version="1.0" encoding="UTF-8"?>
<testcase>
<!--N个命令可查询N个文件有序不相关
此处仅是简化配置
-->
<!--command代表linux命令#{sqlId}代表属性sqlIdsqlId的值代表sql配置文件中sql的sql的id相对应因为存在复杂情况就是文件中的内容从数据库获取再经业务处理生成的只能通过sql去查询数据获取-->
<group id="0">
<command>grep '#{sqlId}' /xx/xx/xxxx.txt</command>
<sqlId>0</sqlId>
</group>
<!--简单命令-->
<command id="1" group="1">
grep 'xxx' /xx/xx/xxxx.txt
</command>
<command id="2" group="2">
grep 'xxx' /xx/xx/xxxx.txt
</command>
</testcase>
当然其中还有很多复杂配置但是不记得了
基于这些配置测试同学只需要按照规则配置好配置jenkins会自动运行代码解析配置进行校验从而完成测试。
Python自动化测试视频教程