自动化测试工程

我想一个基本的自动化测试工程应该需要包含这些吧,当然不同的项目和不同的人最终出来的东西肯定有差别,我觉得应该大同小异吧

1.测试用例的组织逻辑,其中包括用例组织的存储方式,用例的测试开关,用例的描述,用例的不同分类管理等等,至于使用数据库来存储还是表格还是其他方式都可以,如果用数据库的方式,我能想到的是自己设计不同的数据表来存储用例的组织,表格我举得可能更方便点,不然测试起来它哪知道要运行哪些东西呢?
2.测试报告和日志的输出,一个自动化测试完成后,当然需要一个汇总的东西查看了,至于它是一个文本文件呢,还是html,或者其他类型的文件都可以,可以自己来选择,这报告中需要包含的东西至少得有总运行的用例数,失败和成功的数量,失败了哪些,成功了哪些,能够呈现出用例的运行过程和断言的结果,不然报告出来怎么分析失败的原因呢?日志的输出也是为了最后分析一些错误的情况是怎么导致的
3.自定义的模块,测试的过程中总是需要使用到一些自己编写的模块,其中可以包含一些配置文件的读写,测试时调用到的一些方法,譬如测试用例表格的读写,系统cmd的调用,等等各类方法
4.测试用例脚本的分类,测试脚本的种类肯定是不一样的,多少也不一致,那么就需要把这些用例区分开来,为的就是用例起来方便查看修改
5.测试数据存储,在做接口测试的时候应该是需要有一个存放数据的位置,对于同一个接口输入不同的数据来进行测试,当然我这里存放的是测试过程中一个功能需要用到的文件

来公司的时候也没有自动化测试,公司作为原厂有很多oem用户,普遍OEM用户的版本和自家版本都是在手工测试,基本上都是在验证各个版本的基本功能,非常耗时间,正好我设备的功能也熟悉的差不多了,那么我来整一个自动化测试工程吧,我还是能够在版本频繁的时候提高一下效率,从最开始啥都没有,然后一点点加,慢慢的改进过来,对设备的功能也更加熟悉了,能够发现的问题也更加深入了

设备的自动化测试环境
在这里插入图片描述

公司有两个项目是使用的selenium来控制页面ui自动添加功能,然后通过自己编写脚本的逻辑来验证各个功能是否正常,另外一个项目则是用requests的方式来添加设备的规则,然后再验证,这两种方式相当于就是ui的自动化测试和接口自动化测试,测试文件工程的结构都是一致的,这两种方式最终的目的都是为了验证功能

很明显的接口的方式比ui的方式来的更加稳定和快捷,但是接口的方式麻烦的是对于每个功能添加先后顺序和接口的数据包分析比较耗时点,每个接口post的参数不一致,一个功能的先后顺序也有区别,需要抓取整个过程的数据包,然后模拟数据包发送,用接口的方式难点在于数据包的构造分析和模拟登录,而ui的方式则是元素的定位的异常处理

工程整体结构

Case:存放测试用例脚本
Data:存放测试用例使用到的数据
Log:存放脚本运行的所有log输出日志
Module:存放配置文件及相关使用到的自定义模块 Report:存放自动化测试完成后生成的报告(HTML格式)
Run:存放网闸光闸自动化测试运行入口文件
在这里插入图片描述

Database_5:内置数据库同步测试用例
Dut_manage_1:设备管理相关测试用例
File_exchange_4:内置文件同步测试用例
Rule_3:模块测试用例
User_2:三员账号相关测试用例
Web_proxy_6:Web代理相关用例
Fgap_Case.xlsx:光闸测试用例表格,用例的开关处
Gap_Case.xlsx:网闸测试用例表格,用例的开关处
在这里插入图片描述

Autobak:自动备份测试用例文件存放处
Bakinit:rbk文件存放处,每次用例前导入一次配置
Certificate:三员账号证书存放处
Ftp:ftp测试用例相关文件存放处
Http:http测试用例相关文件存放处
Server:存放Http,Https,Ftp服务器外置数据库同步软件
Smb:smb文件交换文件存放处
在这里插入图片描述

整个自动化测试的基本流程

在这里插入图片描述

1.进入入口文件,进行测试需要的环境检测(各类服务器端口的监听)
2.成功后进行配置文件读取,读取所有需要的配置(设备接口ip,等等设置相关信息)
3.用例读取,读取所有需要运行的用例(表格中的开关选择项和测试名)
4.依次进行每个测试脚本运行,脚本中涉及到规则的添加和工具的调用,和断言方法(为什么不写在一个通用的断言方法而是在每个脚本中,因为基本上每个用例的断言不同,断言有时判断某个文件夹的文件数和文件名称,甚至用抓包数量来断言),不通用所有不同测试脚本都独立开来
5.所有脚本操作均被记录到日志信息中,并在控制台实时输出信息
6.依次循环每个用例,最后回到入口文件,生成测试报告,自动打开报告
7.通过邮件的形式提醒测试完成,并将相关测试简要信息和测试报告附件发送

配置文件的读取
自定义的配置文件格式,没有使用标准的格式,自已将配置进行分割

class Config():
    def __init__(self):
        pass

    def read_config(self,name):
    #读取配置文件
        with open('..\Module\config.ini','r',encoding='gbk') as f:
            data = f.readlines()
            for i in data:
                i = i.strip().split('-->')
                if name == i[0]:
                    return i[1]

    def read_ele_xpath(self,name):
     #读取元素常用定位信息
        with open('..\Module\ele_xpath.ini','r',encoding='utf8') as f:
            data = f.readlines()
            for i in data:
                i = i.strip().split('-->')
                if name == i[0]:
                    return i[1]

    def read_case(self,path):
    #读取case的测试名
        run_list = []
        data = xlrd.open_workbook(path, 'rb')
        if quick_check == '1':
            table = data.sheets()[1]
        else:
            table = data.sheets()[0]
        nrows = table.nrows

        for i in range(1, nrows):
            if int(table.cell(i, 4).value) == 1:
                run_list.append(table.cell(i, 2).value)
        return run_list

    def read_case_info(self,casename):
    #读取测试用例的基本执行流程信息
        data = xlrd.open_workbook(dut_case_config_path, 'rb')
        if quick_check == '1':
            table = data.sheets()[1]
        else:
            table = data.sheets()[0]
        nrows = table.nrows
        logger.info('-'*90)
        for i in range(1, nrows):
            if casename == table.cell(i, 2).value:
                for t in str(table.cell(i, 5).value).split('\n'):
                    logger.info(t)
        logger.info('-' * 90)

config = Config()
dut_ip = config.read_config('dut_ip')
dut_type = config.read_config('dut_type')
quick_check = config.read_config('quick_check')
dut_case_config_path = config.read_config('dut_case_config_path')
dut_user = config.read_config('dut_user')
dut_pwd = config.read_config('dut_pwd')
gap_header = config.read_config('gap_header')
sysuser_user = config.read_config('sysuser_user')
sysuser_pwd = config.read_config('sysuser_pwd')
secuser_user = config.read_config('secuser_user')
secuser_pwd = config.read_config('secuser_pwd')
loguser_user = config.read_config('loguser_user')
loguser_pwd = config.read_config('loguser_pwd')
dut_new_pwd = config.read_config('dut_new_pwd')
server_ip_src = config.read_config('server_ip_src').split('/')
server_ip_dst = config.read_config('server_ip_dst').split('/')
server_ip_src_fgap = config.read_config('server_ip_src_fgap').split('/')
server_ip_dst_fgap = config.read_config('server_ip_dst_fgap').split('/')
sysuser_permission = config.read_config('sysuser_permission')
secuser_permission = config.read_config('secuser_permission')
loguser_permission = config.read_config('loguser_permission')
ext_ip_gap = config.read_config('ext_ip_gap')
int_ip_gap = config.read_config('int_ip_gap')
ext_ip_gap_ipv6 = config.read_config('ext_ip_gap_ipv6')
int_ip_gap_ipv6 = config.read_config('int_ip_gap_ipv6')
server_ip_src_ipv6 = config.read_config('server_ip_src_ipv6').split('/')
server_ip_dst_ipv6 = config.read_config('server_ip_dst_ipv6').split('/')
email = config.read_config('email')
email_recv = config.read_config('email_recv')
email_recv_list = []
if '/' in email_recv:
    email_recv_list = config.read_config('email_recv').split('/')
else:
    email_recv_list.append(email_recv)
run_list = config.read_case(dut_case_config_path)
retry_number = config.read_config('retry')
celueguanli_ele = config.read_ele_xpath('celueguanli')
shebeiguanli_ele = config.read_ele_xpath('shebeiguanli')
yingyongpeizhi_ele = config.read_ele_xpath('yingyongpeizhi')

运行完就生成一个漂亮的报告,和其中的详细日志
在这里插入图片描述

关注“码点小干货”公众号,一起分享一起交流各类信息技术和工具资源

愿你眼中总有光芒! - 愿你活成想要的样子!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值