接口测试 关于接口自动化的那些事 - 基于 Python

Ningxw · 2017年03月23日 · 最后由 Alone 回复于 2022年07月20日 · 6685 次阅读
  • 2018/08/21 更新:我上段时间没事做,开通了个人博客啦 -> 宁大大噢耶的博客,里面会发布一些零散的学习笔记,希望能帮助到更多的初学者,觉得好的话给我点赞哦哈哈😁 😁 😁

  • 2017/7/12 更新:这段时间在社区看到很多关于接口测试的精华帖,给我带来了很多的启发~其中一个接口自动化测试的最佳工程实践 (ApiTestEngine),里面的设计思想和实现方式非常的赞!还有另一个是Http 接口测试框架,思路也是非常的不错,有兴趣的小盆友可以根据自己公司的实际情况参考下这两个项目哦~爱学习的孩子快来举个爪~😄 😄 😄 然后根据这两个项目提供的一些思路,对自己的项目做了一些优化,之前的代码略显冗余了~目前还在消化这两个项目,等消化完了再做更大的改进~加油加油~💪 💪 💪

  • 2017/5/5 更新:自上次发帖后,很多热心的小伙伴给了我很棒的建议,对这些小伙伴献上我的 101 分!!😘 😘 于是我也综合了下建议,花了一点时间去修改了下代码的结构,整理下配置文件。主要做的修改在于,提取了常用的操作函数(例如数据库连接、获取 cookie 等)封装到一个.py 文件里,把测试数据(例如数据库配置、url、用户信息、状态码等)整理成配置文件,这样的话,当开发修改某个接口参数时,就可以到公共文件里面直接修改相应的参数,效率起码提升 50% 呀!(给自己献上 102 分!!)😉 😉 自己的代码还有可优化部分,比如在请求数据上也可以封装起来等,有时间的话小伙伴们都可以自己多去尝试哦~~☀ ☀(ps: 正文内容有少许修改,增加部分在最后一 part,欢迎兄弟姐妹来提意见啦~希望能有更好的进步~)😝 😝

开始之前说一些废话

前段时间老大让我搞个接口自动化,好气啊我只想当个纯粹的点点点!(真没志气真没用,真给咱测试丢脸~!😤)后来我挑灯夜读,经过两个星期的挣扎终于把用例搞出来了!噢哈哈真是大快人心啊我真个聪明的家伙给自己一个💯😎 我把做出来的成果贴出来,也顺便把学习的经过贴出来,大家来看看有什么地方可以做得更好的,一起交流学习呀,我会是一个悉心听教的好学生的~嗯!Begin~☀

准备工作

这部分其实在谷歌或者百度上搜索下就可以完成的,可是我就是想再啰嗦一遍,说不定有比我更懒的同学呢哈哈~

第一步 Python 的安装配置

  • 打开官网: https://www.python.org/downloads/ 目前官网上已经更新到 3.6.1 啦,有两个版本,大家可以按自己喜欢的去下载,我自己选择的是 Python3.5,语法对比 2.7 版本的会有些改进,用 2.7 版本的小朋友贴我的代码是会报错的哦!

  • 安装并配置环境 安装过程非常的简单,选择你想安装的目录,然后拼命的点击下一步,然后在最后一步的时候,记得记得记得要勾选底部的“Add Python 3.5 to PATH”,这样的话,你就不用手动去系统环境中配置啦,是不是很 easy 呢!妈妈再也不用担心你的学习啦~(最好再检查一下下啦,快捷键 Windows+R ,打开 CMD 命令,输入 “python”,如果没有报错,那就恭喜你,安装成功~)

  • Python 小提示 学好 Python 语言很重要哦~跟我一样的菜鸟们可以找一本 Python 基础教程,照着例子一个个去练习,不要偷懒哦,只有自己动手写了才会记得更牢呢,亲测有效!在这里推荐一个非常好的学习教程,传送门 -> 廖雪峰的 Python 教程 来来来,菜鸟们跟我念个顺口溜:学好 Python 真重要,走遍天下都不怕~(好像根本就不顺口啊!😆

第二步 Python 编辑器的选择及使用

  • 终于又到了选择编辑器的矫情时刻了,据我短浅的头脑所知,目前比较流行的编辑器有 Sublime Text3,Pycharm,Atom 等,我自己有使用过 Sublime Text3 和 Pycharm,个人感觉 Pycharm 比较符合我的编程习惯,它是 Python 重量级 IDE,能自动检测语法,帮助使用者写出更规范的代码,大家如果有时间的话可以多去使用其它款编辑器,选一个自己最顺眼的,那码起代码来也会爽歪歪~😉 😉

  • Pycharm 传送门 -> http://www.jetbrains.com/pycharm/download/#section=windows 蹬蹬!!看到两个版本就开始头疼啦哈哈~别慌,毫不犹豫选择右边的社区版吧~ 人家专业版是留给大神级别的啦哈哈~ 😂(但据专业人士透露,社区版和专业版的区别并不大,一般的编程开发使用社区版就足够啦~所以宝宝们不需要太纠结版本~)

第三步 打开 Python 编辑器,开始练习吧

  • 恭喜你完成了前面的步骤,到了这一步,咱们就可以开始练习 python 啦~(如果是选择了 Pycharm 的同学,有关于 Pycharm 的配置略复杂,在这里我就不详细解说啦,万能的谷歌可以帮助你~😆

网络请求模拟小技巧

在学习了一段时间的 Python 语言后,咱也大概对 Python 的语法和逻辑有了一定的积累,接下来,可以为接口自动化测试开始尝试做一些比较简单的准备工作啦~跟着我一起来来来~💪 💪

扩展库 requests

一般来说接口测试都是基于 HTTP 和 HTTPS 的网络请求,Python 中有很多自带原生库和扩展库均可以实现。Python 模拟 HTTP 请求有两种方式,一种是使用 httplib 模块,一种是使用 requests 模块,我个人比较倾向于使用 requests 库,该库把请求的框架都搭建好了,使用简洁明了呢~😎

  • 使用 requests

首先要安装及导入扩展库 requests,咱可以使用 pip 来扩展第三方库,打开 CMD,输入pip install requests,安装完成后,打开编辑器,练习使用 requests 库,废话不多说,直接上代码~😍 😍

GET 请求方式模拟:

import requests      #调用requests库
test_url = 'http://xxx:8080.com'      #访问接口的url地址
response = requests.get(test_url)       #发起一个请求,使用get方法
result = response.text          #读取请求返回的结果
print(result)     #打印返回的结果

POST 请求方式模拟:

import requests      #调用requests库
username = 'ningxw'    #定义参数username
password = '123456'   #定义参数password
test_url = 'http://xxx:8080.com'      #访问登录接口的url地址
datalist = {'uname': username, 'pwd': password}    #将参数添加到需求post的data中
head = {"Content-Type": "application/Json"}   #定义头部
response = requests.post(test_url, datas=datalist headers=head)   #发起一个请求,使用post方法
result = response.text          #读取请求返回的结果
print(result)   #打印返回的结果

其实我的废话是可以不用说这么多的,给你们分享一个快速学习 requests 的干货,传送门 -> 快速上手 - Requests ,但是我就是想要展示下我的才气啊,我要表露出我博学多才的气质!哼!!😺

简单的接口自动化测试用例

恭喜你啊恭喜我啊,能把上面的网络请求掌握了,咱就可以继续下一步了~因为懂得了如何向接口请求数据,那我们就可以根据返回的数据来进行断言啦,断言是接口测试的重要部分哦~😎 😎

做接口测试前的准备

  • 理解业务需求

所有测试的基础,都离不开对业务的理解,接口测试也是一样的~只有搞清楚业务的需求和逻辑,咱们才可以设计出一个比较好的用例哦~(我感觉我在讲废话!😄 😄

了解业务需求,比较快速简单的做法是可以从产品经理那边要求获取一份项目的原型,一般原型里面会把项目的内容说得很清楚,里面包含了比较重要的业务逻辑~

了解代码逻辑,可以通过开发已完成的代码去理解代码逻辑和业务逻辑,显然这部分对于大部分测试包括身为菜鸟的我是一样的难,但不得不说这是一个通往更高层面的测试的必经之路,开发的代码里面会包括多个开发的沟通协调及测试人员本身的编程基础和测试思想,为了不让自己成为轻易取代的人,咱必须得努力起来呀~干呀~💪 💪

  • 查看规范的接口文档

咱做接口测试,就得对接口有深入的了解,所以一份规范的接口文档会让接口自动化测试事半功倍~但是呢,要沉淀出一份规范的接口文档,对开发来说无疑是增加重复劳动力的事情,而很多开发也不大愿意想帮助测试做些什么事~(我就常常被之前公司的开发鄙视,说我不务正业,瞎搞东西,让我做好点点点工作就好!真是好气哦!!😔 😔 )所以说呀,凡事还是靠自己呀,要是咱掌握了代码的能力,我们就可以自己去看代码了呀,就可以自己整理出接口文档,又不用有求于人,说不定还可以被上司赏识,从此升职加薪走上人生巅峰迎娶白富美…😍 😍 😍 好了,想想就好了,踏实的工作最重要呢~~😊

最后最后,我有一份不太规范的接口文档,但是对我来说也已经足够了,给你们这些没瞧过接口文档的小小菜鸟看看,长长见识哈哈哈~~(拥有规范的接口文档的大神请无视我就可以了~感激不尽~😊

  • 编写代码完成接口测试

噔噔噔噔~一把鼻涕一把泪的终于要来到写代码测试接口的时刻了😭 😭 ~在理清了业务需求和逻辑后,我们就可以开始试着去写一些请求了,看看接口返回的内容是不是我们预期的结果,然后通过断言来判断测试的结果~在写一个较为完整的用例之前,我们还是需要先巩固 Python 编程,了解一下有关数组的内容,json 数据格式及转换方式unittest 框架等,这样你才可以在写代码的时候游刃有余噢!!😎

贴一下我常用的接口自动化测试代码的基本格式和内容:

import unittest       #导入unittest
import requests     #导入requests库
import json            #导入json

class LianXi(unittest.TestCase):              #定义一个类,类的首字母要大写哦
       def setUp(self):                                 #初始化
             self.base_url = 'http://ip:端口号/url地址'      

       def test_get_success(self):             #定义一个方法,切记要以test开头哦
             datalist = {'参数1': '值1', '参数2': '值2'}               #定义传参数据
             head = {"Content-Type": "application/Json"}     #定义头部
             r = requests.post(self.base_url, params=datalist, headers=head)          #传入参数
             result = json.loads(r.text)            #使用json格式返回
             self.assertEqual(result['status'], 0)      #检验返回值
             print(result)

if __name__ == '__main__':
      unittest.main()

以上就是我编写自动化用例的基本模板了,才疏学浅啊各位大神多多指教~😝
在编写测试代码的时候,会很纠结在 post 数据的时候,应该选用哪个关键字参数,也许聪明的你熟读上面我分享的干货《快速上手 - Requests》就可以搞懂,但是蠢萌的我还是没能完全掌握啊!😔 于是在我无数次的谷歌之后,我找到一个可以暂时解答我疑惑的回答,传送门 -> http://stackoverflow.com/questions/9733638/post-json-using-python-requests ,这部分还是需要多花点时间去学习和巩固哦~ 😆

接口自动化实践

前面啰啰嗦嗦的写了这么多基础的东西,目的就是为了让比我还菜鸟的宝宝们方便学习~到了这一章,估计也是本文的最后一章啦啦啦,咱们就来说说接口自动化的实践吧~宝宝们,带上你的大脑,跟着我一起 high high high~(一言不合就想唱歌的老毛病居然犯了~😝

我现在做的项目是一个提供用户查询物流信息的系统,就给大家讲解一个最简单的“增加单号”接口的例子吧~

  • 业务需求

我们把 “增加单号” 的业务需求逐条提炼出来~

编号 业务步骤
1 用户登录
2 输入单号
3 检验单号是否重复
4 检验单号是否超过今日追踪数量
5 增加单号成功
  • 根据业务,定义需要处理的函数
编号 函数
1 初始化数据:setup(),用来初始化一些比较常用到的数据
2 用户登录:test_getcookie() ,用来获取用户登录的 cookie
3 增加单号成功:test_addtrackno_success(),用来测试增加单号接口
  • 初步的自动化框架

根据定义的函数,可以初步搭建出一个简陋的自动化框架,就是下面那一坨~

class AddTrackNo():
         def setup():
         #初始化数据

         def test_getcookie():
         #获取用户登录的cookie

         def test_addtrackno_success():
         #测试增加单号接口

看到这里,我知道有人想对我的设计以深深的鄙视来吐槽我,来啊造作啊,反正你又打不着我!!哈哈哈~~😝 😝

  • 还是简单粗暴点,上代码吧

上代码前啊我就是想装逼说几句,如今这世道都是套路,不过只要你掌握了其中的思想和工具,那就不在怕的了!就一个字,上!!💪 💪

# -*- coding: utf-8 -*-
#导入各种库
import requests
import json
import unittest
import pymssql
import xlrd
import re

class AddTrackNo(unittest.TestCase):
    '''“(批量)增加单号”接口'''

    def setUp(self):
        '''初始化数据'''
        self.user_url = 'https://xxxxxxuser/call'
        self.buyer_url = 'https://xxxxxxorder/call'

        '''查询数据库中登录用户的信息'''
        self.conn = pymssql.connect(host='192.xx.xx.xx', user='sa', password='123456', database='Test_Buyer1')
        cur = self.conn.cursor()
        sql = 'SELECT TrackNO FROM TrackInfo02 WHERE (Email = '123@qq.com')'
        cur.execute(sql)
        self.result = cur.fetchall()

    def tearDown(self):
        '''关闭数据库'''
        self.conn.close()

    def test_getcookie(self):
        '''用户登录,获取cookie<账号:123@qq.com>'''
        data = {"Version": "xxx",
                "Method": "Signin",
                "SourceType": xx,
                "Param":
                    {"Email": "123@qq.com",
                     "Password": "123456"}
                }
        req = requests.post(self.user_url, json=data)
        res = json.loads(req.text)
        self.assertEqual(res["Code"], 0)
        self.assertEqual(res['Json']['FEmail'], '123@qq.com')
        #print(res)
        cookie = res["Cookies"]
        return cookie       #返回用户cookie

    def test_addtrackno_success(self):
        '''成功_增加单号(状态码:0 保存成功)'''

        '''查询数据库中该用户下的单号'''
        result = self.result

        '''获取EXCEL表内的单号'''
        file = xlrd.open_workbook(r'C:\Users\xx\test_trackno.xlsx')
        sheet = file.sheet_by_name('单号数据')
        cols = sheet.col_values(0)
        n = len(cols)

        '''去除重复单号,并post增加单号'''
        index = 0
        arylist=[]
        for row in result:
            a = re.findall('[a-zA-Z0-9]', str(row))
            sj = ''.join(a)
            arylist.append(sj)
            index += 1

        j = 0
        for i in range(n):
            if(j == 5):
                break
            if(cols[i] not in arylist):
                if len(result)>= 40:
                    break

                else:
                    j += 1
                    datalist = {"Version": "xxx",
                             "Method": "AddTrackNo",
                             "Cookies": self.test_getcookie(),
                             "SourceType": xx,
                             "Param": {
                                "TrackNos": [cols[i]]}
                             }
                    req1  = requests.post(self.buyer_url, json=datalist, headers={"Content-Type": "application/Json"} )
                    res = json.loads(req1.text)
                    print(res)
                    self.assertEqual(res['Code'], 0)
                    self.assertEqual(res['Json']['Items'][0]['ResultCode'], 0)
  • 完善自动化测试用例

以上展示的就是其中一个接口的设计和实现,是不是很简单呢!😝 😝 在实际的项目中肯定会遇到很多很多接口,那咱写完一个接口,肯定不想一个个的跑起来呀,那我们就可以再创建一个文件,使其做自动化跑接口用例~

Run_Tests.py 代码如下:

import time, os
import sys
import unittest
from HTMLTestRunner import HTMLTestRunner     #引入HTMLTestRunner模板

sys.path.append('./Interface')    
test_dir = './interface'       #指定当前文件夹下的Interface目录
file = unittest.defaultTestLoader.discover(test_dir, pattern='*_test.py')    #匹配开头为test的py文件

if __name__=="__main__":

    now = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(time.time()))    # 取当前时间
    public_path = os.path.dirname(os.path.abspath(sys.argv[0]))       # 获取当前运行的.py文件所在的绝对路径
    filename = public_path + "\\Report\\" + now + "report.html"   #保存的报告路径和名称
    fp = open(filename, 'wb')
    runner = HTMLTestRunner(stream=fp,
                            title="接口自动化报告",
                            description="详细描述如下:"
                            )
    runner.run(file)     #执行测试套件
    fp.close()

运行该文件,就可以把很多很多接口用例跑起来啦~😎 😎 代码写得就跟我一样的粗糙!!不过都是新鲜出炉的哈,以后有时间,我会认认真真去规范代码,争取做个努力上进的菜鸟~(认认真真规范的代码增加啦已经 ~~~ 耶耶耶 ~~~ 😝 😝

优化接口自动化用例

啦啦啦啦啦~ 努力上进的小菜鸟又花了一些时间优化了下代码结构😎 😎 上面的一大部分内容已经讲解了如何搭建一个丑陋的自动化接口测试框架,但是呢,爱美嘛是人的天性,自己撸出来的代码也要美化一下呀,不然怎么对得起自己的臭美天性呢哈哈~😝 😝 来来来,一起来看看这个 “整容” 过程吧 ~ 嘻嘻 ~

  • 增加配置文件(conf.ini,请注意内容,有血的教训之提示!!)

conf.ini(主要配置数据库、url、用户信息、状态码等常用数据信息)

[test_db]
#数据库信息(注意不要带上引号哦,不然会报错哦!!!)
host = 192.168.xx.xx
user = sa
password = sa123
db_test_buyer = Test_Buyer1

[user_info]
#用户信息
email = "123@qq.com"
upassword = "123456"

[url]
#请求的接口地址(url不要带上引号哦,不然会报错哦!!!)
user_url = https://xxxxxxuser/call

[code]
#成功状态
success = 0

#追踪号已存在,已添加该单号
TrackNoIsExist = -11010101

#追踪号无效
TrackNoInvalid = -11010102

  • 初始化配置文件 config.py(初始化并封装配置文件的数据)
import configparser    #导入configparser库,用于读取配置文件
import os 

class Config():
    def __init__(self):
        self.config = configparser.ConfigParser()
        self.conf_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'conf.ini')    #获取制定配置文件所在路径
        self.config.read(self.conf_path, encoding='utf-8-sig')     #读取配置文件,编码格式为utf-8-sig

        self.conf = {
            'host': '', 'user': '', 'password': '', 'db_test_buyer': '', 'email': '', 'upassword': '', 'user_url': '', 'success': '', 'TrackNoIsExist ': '', 'TrackNoInvalid ': ''
                        }
        def get_conf(self):
        """
        配置文件读取,并赋值给全局参数
        :return:
        """
        self.conf['host'] = self.config.get("test_db", 'host')
        self.conf['user'] = self.config.get("test_db", "user")
        self.conf['password'] = self.config.get("test_db", "password")
        self.conf['db_test_buyer'] = self.config.get("test_db", "db_test_buyer")
        . . . . . . 
        return self.conf

if __name__ == '__main__':
    Config()
  • 增加公共文件 Common_Func.py(主要配置数据库连接、获取用户 cookie 等常用函数)
import Conf.config          #导入Conf文件夹下的config.py文件,用于初始化配置文件
import pymssql                #导入pymssql,用于连接SqlServer
import requests
import json

def Get_TrackNo():
    '''初始化数据'''
    c = Conf.config.Config().get_conf()   #调用config.py文件的get_conf()函数

    '''数据库配置'''
    db_host = c["host"]
    db_user = c["user"]
    db_password = c["password"]
    db_test_buyer = c["db_test_buyer"]
    db_test_user = c["db_test_user"]

    '''连接SqlServer数据库'''
    conn_buyer = pymssql.connect(host=db_host, user=db_user, password=db_password, database=db_test_buyer)
    cur_buyer = conn_buyer.cursor()
    sql_buyer =sql = 'SELECT TrackNO FROM TrackInfo02 WHERE (Email = '123@qq.com')'
    cur_buyer.execute(sql_buyer)
    trackno_result = cur_buyer.fetchall()

    '''关闭数据库连接'''
    cur_buyer.close()
    cur_user.close()

    return trackno_result      #返回单号列表结果

def Get_Cookie():
    '''用户登录,获取cookie<账号:123@qq.com>'''
    c = Conf.config.Config().get_conf()   #调用config.py文件的get_conf()函数
    user_url = c["user_url"]
    user_email =c["email"]
    user_pwd = c["upassword"]

    data = {"Version": "xxx",
            "Method": "Signin",
            "SourceType": xxx,
            "Param":
                {"Email": user_email,
                "Password": user_pwd }
                }
    req = requests.post(user_url, json=data)
    uid = req.cookies.get('uid')
    return uid                              #返回用户cookie
  • 修改 “增加单号” 接口文件 Addtrackno_test.py
# -*- coding: utf-8 -*-
import requests
import json
import unittest
import xlrd
import re
import Conf.config     #导入配置文件
import Common_Func      #导入公共文件Common_Func.py


class AddTrackNo(unittest.TestCase):
    '''“(批量)增加单号”接口'''

    def setUp(self):
        '''初始化数据'''

        '''获取请求地址'''
        c = Conf.config.Config().get_conf()   #调用config.py文件的get_conf()函数
        self.buyer = c["buyer_url"]

        '''获取状态码'''
        self.success = c["success"]      #成功的状态码
        self.TrackNoIsExist = c["TrackNoIsExist"]      #其它状态码


        '''获取某账号下的单号列表'''
        self.trackno_result = Common_Func.Get_TrackNo()

        '''获取某账号的cookie值'''
        self.user_cookie = Common_Func.Get_Cookie()

    def tearDown(self):
        pass

    def test_addtrackno_success(self):
        '''成功_(批量)增加单号(状态码:0 保存成功)'''

        '''获取某账号下的单号列表'''
        result = self.trackno_result

        '''获取EXCEL表内的单号'''
        file = xlrd.open_workbook(r'C:\Users\xx\test_trackno.xlsx')
        sheet = file.sheet_by_name('Sheet4')
        cols = sheet.col_values(0)
        n = len(cols)

        '''去除重复单号,并post增加单号'''
        index = 0
        arylist=[]
        for row in result:
            a = re.findall('[a-zA-Z0-9]', str(row))
            sj = ''.join(a)
            arylist.append(sj)
            index += 1

        j = 0
        for i in range(n):
            if(j == 5):
                break
            if(cols[i] not in arylist):
                if len(result)>= 40:
                    break

                else:
                    j += 1
                    data1 = {"Version": "1",
                             "Method": "AddTrackNo",
                             "Cookies": self.user_cookie,
                             "SourceType": 0,
                             "Param": {
                                "TrackNos": [cols[i]]}
                             }
                    req1 = requests.post(self.buyer_url, json=data1, headers={"Content-Type": "application/Json"} )
                    res = json.loads(req1.text)
                    print(res)
                    self.assertEqual(res['Code'], self.success)        #使用配置文件数据进行断言
                    self.assertEqual(res['Json']['Items'][0]['ResultCode'], self.success)     #使用配置文件数据进行断言
  • 修改 Run_Tests.py
import time, os
import sys
sys.path.append('./Interface')

import Conf.config   #导入配置文件
import unittest
from HTMLTestRunner import HTMLTestRunner

test_dir = './Interface'

file = unittest.defaultTestLoader.discover(test_dir, pattern='*_test.py')

if __name__ == '__main__':
    Conf.config.Config().get_conf()      #初始化配置文件
    now = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(time.time()))
    public_path = os.path.dirname(os.path.abspath(sys.argv[0]))
    filename = public_path + "\\Report\\" + now + "report.html"
    fp = open(filename, 'wb')
    runner = HTMLTestRunner(stream=fp,
                            title="接口自动化报告",
                            description="详细描述如下:"
                            )
    runner.run(file)
    fp.close()
  • 接口自动化测试框架结构

小伙伴们看到这么多乱糟糟的代码肯定是已经头晕眼花,想马上关闭页面放弃治疗了是吧哈哈~下面本宝宝给大家列出了本次测试框架的结构,很清晰明了辣~大家记得要在每个文件夹下加上 init.py 文件哦,不懂为什么要这么做的小伙伴,谷歌和百度搜搜搜就出来啦!!本宝宝脑力有限,就将就看看吧哈哈哈我不管啦!😆 😆 😆

Conf/
  |-- init.py
  |-- conf.ini 
  |-- config.py
Interface/ 
  |-- init.py 
  |-- Common_Func.py.py 
  |-- Addtrackno_test.py 
Report/ 
  |-- report.html 
init.py
Run_Tests.py 

总结

好啦,看到这个标题,你就知道我想说什么啦~花了整整一天的时间去编写这篇文章,还要担心产品和开发过来找我定位问题,我可是冒着生命危险在给大家伙分享我的学习经历和成果呢!!😭 😭 自己写完也检查好几遍了,以我有限的脑力和胡言乱语,我完成了人生中第一篇博客分享~这感觉就像是拱了一颗优质大白菜,哈哈哈哈哈~😆 各路兄弟姐妹,很感谢你能看到这里,同时也特别希望你们可以给我提出意见,在测试的这条路上,我始终都是自己一个人瞎搞乱搞,搞出来的东西也没人帮我检验正误,搞不出来的东西我也还是搞不出来~😔 但是好在我肯努力呀,肯学呀,不会就是不会,我从来不会掩饰自己的无知,但也不会卖弄自己的本事,其实就是没本事卖弄而已😂 期待大家给与我的意见~嗯!End~! 🌛

共收到 109 条回复 时间 点赞

行文风格好评,666

Ningxw #114 · 2017年03月24日 Author
恒温 回复

😝 😝 谢谢夸奖,我会继续努力的~

一看就是个卖萌妹子的路线啊

112楼 已删除
Ningxw #111 · 2017年03月24日 Author
和曦 回复

哈哈,不好意思老女孩卖萌了😂 希望多多给与意见哦~

Ningxw #110 · 2017年03月24日 Author

哇噢,好棒~我之前也有学习过 RF,但是由于教程都是很基础的东西,没办法深入到实践,所以就放弃了~😭 我得跟你好好学习~

楼主好萌,格式也好赞。

前段时间也做过一些接口测试的东西,给妹子一些建议。

把数据(测试使用的数据,配置,url 等等),测试动作(初始化),工具方法(请求)抽象出来,以后对于迁移,维护,写更多的用例会有好处。

另外,既然用了数据库,为啥还用本地 xls 文件存数据?

Ningxw #108 · 2017年03月24日 Author
剪烛 回复

😆 😆 很感谢你的建议噢,我会花时间去把你说的东西实践看看的~

对于为啥还用本地 xls 文件存数据,其实是因为我想做批量增加单号,运行多次的话会使得数据库跟 excel 表的单号重复,所以就得先排除数据库跟 excel 表重复的单号,然后再从 excel 表格取新数据去 post,所以呀不是用 excel 在存储数据哦是用来批量增加数据~嘻嘻~

剪烛 回复

同意,抽象成数据驱动最好。

谢谢楼主分享,666

—— 来自 TesterHome 官方 安卓客户端

Ningxw #11 · 2017年03月24日 Author
jamie 回复

能帮得到你的话,那就好啦😎

不错!

Ningxw #13 · 2017年03月24日 Author
PEPSI 回复

😄 😆 😆 谢谢~

诶?其实我的意思数据存在的地方,而不是说用来干嘛。不过我只是建议下,你还是按照你舒服的方式来吧。

剪烛 回复

太强势了,处女座还是狮子座还是巨蟹座的

回复

惊恐,我是金牛的

Ningxw #99 · 2017年03月24日 Author
剪烛 回复

原来你说的是这个意思呀~~因为数据库的东西我是不可以乱动的嘛,所以只能用 excel 表啦,我个人也觉得用数据库会比较方便简洁呢~

可以使用 xml 进行用例的管理,同时完善测试框架的功能

有种快递 100 的感觉,自带背景音乐:痒

Ningxw 回复

批量操作这种建议做成接口测试框架本身的功能,比如你在请求中加个占位符test%100%,表示该请求从test1、test2...test100自循环 100 次;同理再加个全局的随机值,如 $RANDOM$,这样和上面的搭配在一起test%100%$RANDOM$,就可以基本保证你每次运行产生的数据都不会冲突了,而且脚本会很简洁

666,这风格 6 得不行不行的

—— 来自 TesterHome 官方 安卓客户端

Ningxw #93 · 2017年03月27日 Author
peterzamyx 回复

有没有具体的例子供学习呀??我觉得你这个办法很不错~

Ningxw #24 · 2017年03月27日 Author
xinxjxjxj 回复

😉 😉

Ningxw #25 · 2017年03月27日 Author
玛雅 回复

😂 😂 哈哈哈,纯属乱来的啦~

Ningxw #90 · 2017年03月27日 Author
六星 回复

😎 来来来一起 666

Ningxw #27 · 2017年03月27日 Author
虚冰丶夜 回复

哇噢,谢谢赐教~😆 😆 😆

88楼 已删除
Ningxw #29 · 2017年03月28日 Author

😎 😎 在这里就可以联系到我啦


打印数据,放在断言前面比较好,假如你的断言失败了,不会再去执行打印功能的

干脆直接用 Django 写管理系统算了又方便又简单又容易维护

Ningxw #32 · 2017年03月29日 Author

嗯啊,你说的这个方法也不错的,我现在也正在学习 Django,等哪天技术到家了,我就把它加上去😂 😂

😊可爱的妹子,像你学习啦,求好友位

—— 来自 TesterHome 官方 安卓客户端

Ningxw #82 · 2017年03月30日 Author

嗯哼,一起学习吧😆 😆

正在自学当中,向楼主学习哈

Ningxw #36 · 2017年03月31日 Author
枫叶 回复

哈哈,加油哈~~😎

妹子好 666,好像在听 Rap

—— 来自 TesterHome 官方 安卓客户端

有几个建议,数据库用 orm ,这个也便于后期 assert 时数据库拿数据,二写日志,三把一些你的操作配置话,抽象化,如请求地址,请求方法,通用参数,这样你写 test 只需要传入参数就可以,四可以考虑写个解释器,用于 excel 专门取数据,然后你就可以愉快的用 Excel 就行了

楼主,你遇到过这种问题吗? no tests were found,请经验分享下

Ningxw #40 · 2017年04月05日 Author
吕明浩 回复

有啊,那就是你的文件名没有获取到咯,格式不对,又或者是你的方法名字定义错啦,你可以检查下~😎 希望对你有帮助~

Ningxw #75 · 2017年04月05日 Author
六星 回复

哟哟切克闹,哈哈哈~这样学习工作才有乐趣嘛~😆

Ningxw #42 · 2017年04月05日 Author
路人荚 回复

哇噢,你的建议好赞~~有没有什么比较好的关于这个的技术文章推荐呀,一下子找不到头脑呢😂

请问 RF 是什么东西,请教呢.

kingTester 回复

robot framework

yuweixx 回复

懂了,TH

妹纸 666,像你学习!

Ningxw 关闭了讨论 04月13日 15:52
Ningxw 重新开启了讨论 04月13日 15:52
Ningxw #49 · 2017年04月13日 Author
纽扣很忙 回复

嘻嘻,加油哦~

卖萌可耻,老司机😓

纽扣很忙 回复

你找找,字错了。

666、深夜被萌到不行、致敬楼主学习精神😊

Ningxw #63 · 2017年04月20日 Author
CN3604 回复

卖萌,那首先也得是萌,才有得卖呀,哈哈(不要脸.jpg)😝

Ningxw #54 · 2017年04月20日 Author
回复

😄 😄 加油哦,一起学习一起交流一起进步~

Ningxw 回复

画风好诡异。

多写点,加油

Ningxw #59 · 2017年04月20日 Author
CN3604 回复

嗯嗯 我会的

Ningxw 回复

风格很 6,首先楼主你是不是有代码基础然后又跑去啃的 python 那颗小白菜?

Ningxw #57 · 2017年04月20日 Author
大山 回复

嗯嗯是的呀,大学学的是计算机专业嘛😝 说个大实话,python 比起其他语言来说,真的是简单易懂很多呢哈哈~

但是我就是想要展示下我的才气啊,我要表露出我博学多才的气质!哼!!😺 评论比文章好看。。。

妹子这是要火啊😂

Ningxw #54 · 2017年04月20日 Author
回复

哼!!这种气质我一般不外传,除非你夸我!😎

Ningxw #53 · 2017年04月20日 Author
Scofell 回复

😂 😂 快来灭火,我怕死!

Ningxw 回复

请问下,import json 模块失败; python 版本 2.7,IDE;pyCharm

我爱上你了

Ningxw #66 · 2017年04月21日 Author
Scofell 回复

正常情况下应该不大可能呀,json 是内置库呢,你可以试着在 IDE 使用 json,编辑器有时候的提示不太对哦~😊 希望可以帮到你~

亭子 回复

这是我的荣幸~~😊 😊 ☀ ☀

写的很清晰!

Ningxw #69 · 2017年07月06日 Author
frog2 回复

😊 😊 有待进步呢~

文风丧胆~哈哈哈,学习态度好评!

继续加油~

Ningxw #72 · 2017年09月12日 Author
yangqinyuan 回复

🍻 🍻 一起加油~

Ningxw #73 · 2017年09月12日 Author
路悠炎 回复

😁 😁 谢谢鼓励,你也是~

猜猜我是

Ningxw #75 · 2017年09月18日 Author
CN3604 回复

狗头

Ningxw 2017 末,两年半 中提及了此贴 12月29日 15:40

这种诙谐的风格非常棒啊

Ningxw #78 · 2018年01月02日 Author
FelixKang 回复

😁 😁 谢谢称赞

你好厉害,而且也好好玩,哈哈哈

仅楼主可见
Ningxw #35 · 2018年01月04日 Author
zhang 回复

不厉害不厉害,还是菜鸟,入了门的菜鸟,哈哈😂 😂

82楼 已删除
Ningxw · #83 · 2018年01月04日 Author
仅楼主可见
仅楼主可见
Ningxw #31 · 2018年03月22日 Author
zxl挽狂澜 回复

有问题可以直接留言给我哈,一起交流学习吧~

仅楼主可见
Ningxw #87 · 2018年04月08日 Author
pyy 回复

建议的话,还是先把语言学好哈,Python,Java 都可以,等你学得七七八八了,再去学一个前端框架,或者自动化框架,结合实际项目做,一步步优化下去。相信这样一路走下来,你会收获很多的~加油哈

仅楼主可见
Ningxw #89 · 2018年04月19日 Author
韩利青 回复

在这里设置一下 Python 的路径

写的很清晰,不错学习了

Ningxw #91 · 2018年04月25日 Author
饺子 回复

😁 继续加油哦

有做萌系导师的潜力啊!

Ningxw #93 · 2018年05月08日 Author

过奖了哈~😁

94楼 已删除

你好 想请教一下 如果接口 2 的传参 有多个来源于接口 1 的返回值 这种情况 在 Excel 表里面怎么写呀 key1 和 key2 key3 之间用分号吗 谢谢

你好,麻烦问一下,连接数据库一直提示下面的错误,为啥呢???
'''
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '39.107.177.255' ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)")
'''

Ningxw #97 · 2018年08月14日 Author
119 回复

先检查下你的地址和用户密码那些有没有填写正确哦,如果都是正确的,那可能是 DBA 限制了你的其它应用的访问,可以找下运维同事解决下~希望能帮到你

Ningxw #98 · 2018年08月14日 Author
mg 回复

用 excel 表的形式我不大会哈,用配置文件的形式可以把参数定义为变量,用特殊字符来约定这个是变量,然后把接口 1 的值传给这个变量就好啦~

Ningxw #17 · 2018年08月14日 Author

嘻嘻,谢谢喜欢~

萌萌哒的楼主小可耐

萌萌的女生学习就是厉害

仅楼主可见
Ningxw #103 · 2019年03月05日 Author
章福鹏 回复

嘻嘻,谢谢喜欢~我好久不来社区混啦~

仅楼主可见

楼主萌妹子,来啊,互相伤害
python 写接口自动化,真的是两个极端,浅得沾沾自喜,深得怀疑人生

Ningxw #106 · 2019年03月07日 Author
Test44 回复

嘻嘻嘻,我就是浅的那种,哈哈~

Ningxw 回复

萌妹子别谦虚
我还在浅水区划水哈哈

楼主你好,请问应届生想要走接口自动化方向,面试要准备哪些?

sky123ings 回复

想做自动化,首先还是编程语言基础吧,python,java 都可以掌握一门,其他方面的 数据库,linux;了解不同语言的相关的自动化框架,web 端,移动端都需要了解,最后还是 基础比较重要,编程语言,掌握语言我觉得,无论哪个方向看自己兴趣爱好了,现在测试要求越来越高,全面的能力也很高

sky123ings 回复

哈哈,有个小伙伴已经帮忙回答啦~那我就补充一些,在做技术测试的前期,还是要把测试基本知识学好,例如需求分析,用例设计,测试方法等等,这样你在测试知识支撑上才能更好的做一些技术类的测试哦,希望能帮助到你~

笑笑521 回复

非常感谢

Ningxw 回复

好滴,谢谢

楼主这个框架用到公司项目中了吗

Ningxw #114 · 2020年01月15日 Author
gegd 回复

这个是我自己学习的时候实践的项目啦,在实际的工作中肯定是不大适用的,现在已经在此基础上改版了很多次啦~但基本原理也还是这样子的

有源码地址分享吗

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册