接口测试是面试测试岗位基本都会问到的问题,但是对于一些刚做测试的小伙伴可能并不是很熟悉,也有可能了解接口测试,但是完全不知道接口自动化怎么做。下面我们大概介绍一下。 首先我们需要知道接口自动化测试的目的是为了节约手工测试接口的时间或者减少不必要的重复工作,或者为了监控线上接口是否运行正常等情况的发生。在我们日常的接口测试工作中大多数小伙伴可能都是用一个接口工具:fiddler、postman、jmeter、soapui等等来进行一个简单的接口测试,当然工具的选择这个看大家的喜好,但是我们都会发现一个特点,这些工具如果仅仅是工具的使用我们都不能够根据自己的业务等特殊情况进行修改,具有一定的局限性,并且一些只能一次测试一个,最最最关键的是这个无法体现我们的逼格,是不是有种感觉就是没办法体现我们自己的价值,如果面试使用这些好像无法要出高工资。那下面我们就从这简单的第一步开始,让我们从简单的提高自己开始。 如果使用一门语言来做接口测试,我会毫不犹豫的选择python,他的高效不是一般的。我们先看下面使用python测试慕课网登陆的一个简单例子:

import requests
import json
url = "http://m.imooc.com/passport/user/login"
data = {"username":"185xxxxxx","password":"111111","verify":"", "referer":"http://m.imooc.com"}
res = requests.post(url, data).json() print res

  

看到上面的代码有点像样子了,如果在实际项目中我们要测试一个登陆接口那么我们只需要将上面的代码拿过来,然后将我们的url更换一下,然后将用户名和密码信息换一下就ok,但是我们会发现一个问题,这个代码看着没有复用性,而且实际存在的价值并不是很高,所以我们可以将上面的代码进行一个简单的封装,把封装成一个函数,我们需要传入url、data就可以了,然后我们每次需要测试接口时调用这个函数就能够完成我们的测试,结果如下:
import requests
import json
def post_main(url=None,data=None):
#参数必须按照url、data顺序传入
res = requests.post(url=url,data=data).json()
return res 
    这样看起来是不是觉得顺手一点点了呢?此时我们的代码确实没什么问题了,但是看着好像少了点东西,不知道你是否觉得?因为在我们常见的接口中不止是有post类型的接口,我们还有get类型的接口,那么我们是不是要根据不同类型的接口做不同的封装呢?那我们做get的接口是如何进行测试的呢?看下面代码:
import requests
import json
res = requests.get(url).json()
print res

  

看见上面的代码和之前我们写的代码是不是发现了一些区别,其实在python中使用requests库进行接口时我们唯一的区别就是实用post、get两个函数,他们就分别对应了测试post类型和get类型的接口,同样的我们将get接口的函数进行一个简单的封装,那么就成了下面的样子:

import requests
def get_main(url=None,data=None):
res = None
res = requests.get(url=url,data=data).json()
return res

  

    通过上面的代码和之前封装的代码我们是不是就简单的把我们常见的post和get两个类型的接口进行了一个封装,我们如果下次需要测试接口只需要去调用这个就可以了呢?但是我们发现一个问题如果我们需要调用,每次还需要知道我们接口类型,然后来调用不同的方法,这样是不是有点麻烦呢?那我们应该怎么去简化整个过程呢?我们是不是可以将我们这俩函数封装在一起然后有一个主要的入口,然后其他的地方来进行调用?答案肯定是可以的,我们只需要封装一个主函数就行,这个函数主要功能是做什么呢?他主要是用来辨别你接口是什么类型的,然后去调用不同类型的接口。那就变成了下面这样:
import requests
def post_main(url,data):
#参数必须按照url、data、header顺序传入
res = None
res = requests.post(url=url,data=data).json()
return res #get接口主入口
def get_main(url,data):
res = None
res = requests.get(url=url,data=data).json()
return res #调用postman
def run_main(method,url=None,data=None):
res = None
if method == 'Post':
res = post_main(url, data)
else:
res = get_main(url, data)
return res

  

看到这里是不是有那么点明白的感觉?其实我们只需要将我们的两个函数封装起来就ok了,但是其实看到这里我们觉得还是少点什么?能不能把整个封装成一个类呢?答案肯定是可以的,看下面:

#-*- coding: utf-8 -*-
#author: mushishi
#Date:2017年11月7日
import requests
import json
class RunMethod:
#传入参数 url data header
def post_main(self,url,data):
#参数必须按照url、data顺序传入
res = None
res = requests.post(url=url,data=data).json()
return res
#get接口主入口
def get_main(self,url,data):
res = None
res = requests.get(url=url,data=data).json()
return res #调用postman
def run_main(self,method,url=None,data=None):
res = None
if method == 'Post':
res = self.post_main(url, data)
else:
res = self.get_main(url, data)
return res if __name__=='__main__':
data = {"username":"185xxxxxx","password":"111111","verify":"", "referer":"http://m.imooc.com"}
t = RunMethod()
print t.run_main('Post','http://m.imooc.com/passport/user/login',data)

  

这个整段代码是不是就变成了我们刚开始测试很low的那代码的封装呢?对的,但是有没有思考过一个问题,这样看起来虽然有点样子了,但是是不是还缺少点什么呢?我们能不能够按照一条case一条case那样执行呢?好比我登陆时传入不同的用户信息,然后返回不同结果,有不同的断言呢?肯定可以,我们这里简单引入一个unittest的框架,具体看下面:

#-*- coding: utf-8 -*-
#author: mushishi
#Date:2017年11月7日
import unittest
class TestDemo(unittest.TestCase):
def test_one(self):
#这是第一条case
print "这是第一条case"
def test_two(self):
#这是第二条case
print "这是第二条case"
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestDemo('test_one'))
suite.addTest(TestDemo('test_two'))
unittest.TextTestRunner().run(suite)

  

这里  我们能够看到一个简单的unittest的简单架子,首先我们是引入了一个unittest包,然后创建类的时候继承了这个unittest.TestCase这个方法,在下面我们只需要编写我们的case就可以了,在程序的执行入口,我们将两个case添加到一个组件中,然后去运行这个组件就ok了。虽然架子有了,我们要怎么把我们的requests的基础模版和我们的unittest结合起来呢?其实我们只需要在我们的unittest类开始将我们的RunMethod类引入然后使用就好,然后结果变成了下面这个样子:

#-*- coding: utf-8 -*-
#author: mushishi
#Date:2017年11月7日
import unittest
from base.runmethod import RunMethod
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.run_method = RunMethod()
def test_one(self):
data = {"username":"185xxxxxx","password":"111111","verify":"", "referer":"http://m.imooc.com"}
res = self.run_method.run_main('Post','http://m.imooc.com/passport/user/login',data)
print res
def test_two(self):
data = {"username":"185xxxxx","password":"111111","verify":"", "referer":"http://m.imooc.com"}
res = self.run_method.run_main('Post','http://m.imooc.com/passport/user/login',data)
print res
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestDemo('test_one'))
suite.addTest(TestDemo('test_two'))
unittest.TextTestRunner().run(suite)

  

看到  这里好像有那么点意思了,但是美中不足的是好像我们还没有测试报告那我们需要如何去生成一个测试报告呢?这里我们就需要运用我另外一个东西HTMLTestRunner.py,这个文件可以在网上下载,我们这里可以直接使用,同样的我们只需要将HTMLTestRunner这个引入就好,接着上面的代码我们往下看:

import HTMLTestRunner
import unittest
from base.runmethod import RunMethod
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.run_method = RunMethod()
def test_one(self):
data = {"username":"185xxxxxx","password":"111111","verify":"", "referer":"http://m.imooc.com"}
res = self.run_method.run_main('Post','http://m.imooc.com/passport/user/login',data)
print res
def test_two(self):
data = {"username":"185xxxxx","password":"111111","verify":"", "referer":"http://m.imooc.com"}
res = self.run_method.run_main('Post','http://m.imooc.com/passport/user/login',data)
print res
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestDemo('test_one'))
suite.addTest(TestDemo('test_two'))
#定义报告路径
filename = 'test.html'
#定义报告文件权限,wb,表示有读写权限
fp = file(filename,'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream = fp,
title ='MushishiTest',
description = '测试报告')
#执行测试
runner.run(suite)
#关闭文件,否则会无法生成文件
fp.close()

  

上面看着没什么变化,这里我们只是将unittest创建的测试组件放在了HTMLTestRunner中去运行,这样运行后就有我们的结果了呢?
思考:这就真的达到了我们接口的自动化了么?答案肯定是否定的。那具体怎么实现呢?

作者: Mushishi_Xu 
链接:http://www.imooc.com/article/21104
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!

python实现接口测试到unittest框架集成的更多相关文章

  1. Selenium2+python自动化30-引入unittest框架

    from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.com ...

  2. python学习笔记之——unittest框架

    unittest是python自带的单元测试框架,尽管其主要是为单元测试服务的,但我们也可以用它来做UI自动化测试和接口的自动化测试. unittest框架为我们编写用例提供了如下的能力 定义用例的能 ...

  3. Selenium2+python自动化30-引入unittest框架【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/unittest/ from selenium import webdriverfrom ...

  4. Python学习笔记:Unittest框架了解

    Unittest单元测试框架不仅可以适用于单元测试,还可以适用于自动化测试用来的开发与执行,该测试框架可执行测试用例,并提供丰富的断言方法,最终生成测试报告. 一.Unittest常用方法 1.Tes ...

  5. python之单元测试及unittest框架的使用

    例题取用登录模块:代码如下 def login_check(username,password): ''' 登录校验的函数 :param username:账号 :param password: 密码 ...

  6. 记录python接口自动化测试--unittest框架基本应用(第二目)

    在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...

  7. 基于Python的接口自动化-unittest测试框架和ddt数据驱动

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  8. python之unittest框架实现接口测试实例

    python之unittest框架实现接口测试实例 接口测试的方法有很多种,具体到工具有postman,jmeter,fiddler等,但是工具的局限性是测试数据的组织较差,接口的返回工具的判断有限, ...

  9. 基于python的接口测试框架设计(三)接口测试的框架

    基于python的接口测试框架设计(三)接口测试的框架 其实我这里用到的是unittest单元测试框架,,这个框架好就好在比较清楚,,setup terdown都可以处理一些初始化及完成后的工作 主要 ...

随机推荐

  1. <转>JavaScript的IE和火狐的兼容性解决办法

    原文发布时间为:2009-05-06 -- 来源于本人的百度文章 [由搬家工具导入] 1. document.form.item 问题 (1)现有问题: 现有代码中存在许多 document.form ...

  2. Codeforces 920E Connected Components? 补图连通块个数

    题目链接 题意 对给定的一张图,求其补图的联通块个数及大小. 思路 参考 ww140142. 维护一个链表,里面存放未归入到任何一个连通块中的点,即有必要从其开始进行拓展的点. 对于每个这样的点,从它 ...

  3. Windows开发

    1. 介绍 这里简单介绍了Windows应用程序开发的基础知识 2. 基础 Windows下的应用程序有控制台程序和Win32窗口程序,这里讲的是Win32窗口程序 Windows提供了相关静态库(L ...

  4. hexo安装问题解决方法

    常见错误 { [Error: Cannot find module './build/Release/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' ...

  5. atom 默认的换行符设置成LF

    如何把atom 默认的换行符设置成LF Select File->Settings Select ‘Packages’ Under Core Packages->line-ending-s ...

  6. 洛谷——P3183 [HAOI2016]食物链

    P3183 [HAOI2016]食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形 ...

  7. Write a function that generates one of 3 numbers according to given probabilities

    You are given a function rand(a, b) which generates equiprobable random numbers between [a, b] inclu ...

  8. 单堆石子的Nim Game

    两个人轮流捡石子,只有一堆石子,石子数为n.每个人每次至少捡一个石子,至多捡m个.取走最后一个石子的人胜利,若我方先手,求能否胜利. 若n % (m + 1)为0,则必输,否则必赢.

  9. 网络安全---大学霸_ITDaren

    http://blog.csdn.net/u014621518/article/category/2191665

  10. 常用jar包之commons-digester使用

    常用jar包之commons-digester使用 学习了:https://blog.csdn.net/terryzero/article/details/4332257 注意了, digester. ...