十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

python+requests接口自动化测试框架实例详解教程(米兔888)【适合半年或一年以上天天做自动化经验的大神下载使用】

python+requests接口自动化测试框架实例详解教程(米兔888)【适合半年或一年以上天天做自动化经验的大神下载使用】 前段时间, 由于公司测试方向发生转型, 从原来的web页面功能测试转变为接口测试, 以前大多是手工开展, 凭借和做的接口测试, 后来, 组内有人说将原先web自动化的测试框架转变为接口的自动化框架, 运用的是java语言, 然而对于一个学java, 却在学的我来讲, 觉得相较于java更简便些, 所以, 我决定编写自己的接口自动化测试框架, 鉴于本人也是刚开始学习, 这套自动化框架目前已基本完成, 于是进行一些总结, 以便日后回顾温习, 存在许多不完善之处, 也遭遇了许多问题, 期望大神们多给些指导。此刻, 我就要开启今日的重点内容喽瞧, 那可是初学者通向成功的路径, 嘿嘿嘿~~。1、首先我们先来理一下思路。正常的接口测试流程是什么脑海里的反应是不是这样的找出用于确定测试接口的工具, 接着配置所需的接口参数, 随后开展测试工作, 再去检查测试结果, 里面有的情况还需要数据库提供辅助, 最后生成是以html格式呈现的测试报告。既然如此, 那咱们便循着如此这般一个过程, 去一步步构建咱们的框架。这个过程里, 咱们务必要达成业务跟数据的分离, 如此才能够足够灵活, 进而实现咱们撰写这个框架的目的。只要切实做好, 是肯定能够成功的。这同样也是我当初对自己讲的。接下来我们来进行结构的划分。我的结构是这样的大家可以参考下​​​​​​ 存放一些共通的方法执行过程中生成的文件夹里面存放每次测试的结果用于存放具体的测试case放置存于测试进程里所运用的文件, 这其中涵盖上传的文件, 还有测试用例, 以及数据库的sql语句。txt文件配置每次执行的case名称配置一些常量例如数据库的相关信息接口的相关信息等 用于读取配置文件中的内容用于执行case假定整体架构已然存有划分, 紧接着便会是逐个步骤地去填充整个架构了, 首先, 我们先瞧瞧.ini以及.py这两个文件, 从它们开始着手, 个人认为相对易于继续推进下去哟。我们来看下文件的内容是什么样子的[DATABASE] host 50.23.190.57 username xxxxxx password ****** port 3306 database databasename [HTTP] # 接口的url baseurl http://xx.xxxx.xx port 8080 timeout 1.0 [EMAIL] mail_host smtp.163.com mail_user xxx163.com mail_pass ********* mail_port 25 sender xxx163.com receiver xxxxqq.com/xxxxqq.com subject python content All interface test has been complited\nplease read the report file about the detile of result in the attachment. testuser Someone on_off 1不难想象, 大家都清楚有这样一种配置文件, 确实如此, 那些始终保持不变的事物, 我们都能够把它们放置于此。嘿嘿, 怎么样, 是不是挺好的呀。当下, 我们已然准备好了固定的“仓库”, 用来存放我们平日里不动的物品, 那么, 我们该如何将那物品取出供我使用? 此时, .py文件诞生了, 它切实地帮助我们化解了这个难题, 下面就让我们一瞧其真实面貌import os import codecs import configparser proDir os.path.split(os.path.realpath(__file__))[0] configPath os.path.join(proDir, config.ini) class ReadConfig: def __init__(self): fd open(configPath) data fd.read() # remove BOM if data[:3] codecs.BOM_UTF8: data data[3:] file codecs.open(configPath, w) file.write(data) file.close() fd.close() self.cf configparser.ConfigParser() self.cf.read(configPath) def get_email(self, name): value self.cf.get(EMAIL, name) return value def get_http(self, name): value self.cf.get(HTTP, name) return value def get_db(self, name): value self.cf.get(DATABASE, name) return value情形如何, 是否看上去颇为简易, 我们所定义的办法, 依据名称获取相应的值, 是不是如此轻松当然, 此处我们仅仅运用了get方法, 还有诸如set方法等其他的, 有兴致的同学能够自行去探究一番, 也能够瞅瞅小编我自身的有关读取配置文件的博文, 这里我们就不再详细说明了。话不多说我们先来看下到底有哪些东西。我们既然已经完成了配置文件, 也完成了读取配置文件, 并且看到了其中的内容, 那么接下来就能够去写其中的共通方法了, 可是该从哪一个开始着手呢? 今日, 我们就要翻“Log.py”的牌子了, 这是由于它相对较为独立, 我们能够单独与它进行交互, 也是为了在以后它能为我们提供服务时奠定良好基础。对此处而言, 在这方面, 我怀有想法要向大家再多阐述几句, 面对着这个log文件, 我针对它专门开启了一个单独的线程, 如此一来, 在整个运行的进程当中, 待我们着手去写log之际也会显得足够便利, 依据给出的名字大家自然也就明晰晓得啦, 此处便是我们针对输出的日志展开的全部操作了, 主要涵盖对输出格式进行某种规定, 对输出等级予以明确的定义以及围绕其他一些输出方面进行的相关定义等诸多情形。总归到底, 你意欲针对log实施的任何行为, 均可于此放置妥当。我们一起来查看一下代码, 不存在比这个更具直接性且更富有效性的情况了。import logging from datetime import datetime import threading先是要如同上面那般, 引入所需模块后并不能直接进行接下来的操作, 而是要在引入所需模块之后, 才能够顺利去开展后续的行动。class Log: def __init__(self): global logPath, resultPath, proDir proDir readConfig.proDir resultPath os.path.join(proDir,
返回列表