python接口测试之mock(八)

作者 无涯

      在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证在客户端开发的时候,

api在server端已经开发完成,专门等着前端来调用,理想的情况是前端在开发的时候,已经有人写好了接口,直接调用就可以了,但是这仅

仅是理想的情况,很多时候,现实总是比理想多一层思考和磨难,如果在前端开发的时候,提供api的同学没有提供,那么怎么办?等待还是

自己先开发,等待肯定是愚蠢的做法,那么自己开发怎么来解决api提供数据的这个问题,那么使用mock就可以很好的解决,什么是mock?

mock简单的理解就是开发在开发的过程中,需要依赖一部分的接口,但是对方没有提供或者环境等等情况,总之是没有,那么开发使用mock

server自己来mock数据,方便自己正常的进行开发和对编写的功能进行自测。在https://github.com/dreamhead/moco地址中可以下载到

moco-runner-0.11.0-standalone.jar,下载下来就是一个jar,在该地址中,作者对这部分有详细的说明和启动mock server方法,这里不在重复的再次说明。

下来我们

简单的编写一个登录的,见编写的login.json字符串:

[
  {
    "request":
    {
      "method":"post",
      "uri":"/login",
      "json":
      {
        "username":"admin",
        "password":"admin",
        "roleID":22
      }
    },
    "response":
    {
      "json":
      {
        "username":"wuya",
        "userID":22,
        "token":"asdgfhh32456asfgrsfss"
      }
    }
  }
]

在运行命令前,最好让mock server与编写的login.json文件是在同一个目录下,见执行的命令:

 java -jar  moco-runner-0.10.0-standalone.jar http -p 12306 -c login.json

在如上的命令中,java -jar  moco-runner-0.10.0-standalone.jar是启动jar,没什么可说的,http表示进行的是http协议,

-p后面跟的是端口号,这里端口号指的是12306,-c后面跟编写的json文件,这里是login.json,见执行如上的命令后出

现的信息(切记无任何的错误信息表示OK,如果有错误,慢慢的进行检查错误),见截图:

     OK,下来我们使用postman来验证下,我们mock的登录接口是不是OK的,见postman中填写的信息,见截图:

header为:

  • Content-Length →63

  • Content-Type →application/json

       OK,学习到这里,我们使用python编写一个接口测试用例,来验证换这个登录的接口和获取它的token,见实现的代码:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-

import  unittest
import  requests

class MockLoginTest(unittest.TestCase):
   def setUp(self):
      self.url='http://localhost:12306'

   def tearDown(self):
      pass

   def getUrl(self,path):
      return self.url+path

   def getToken(self):
      '''获取token'''
      data={
         "username":"admin",
         "password":"admin",
         "roleID":22
      }
      r=requests.post(self.getUrl('/login'),json=data)
      return r.json()['token']

   def test_login(self):
      '''验证登录的接口'''
      data={
         "username":"admin",
         "password":"admin",
         "roleID":22
      }
      r=requests.post(self.getUrl('/login'),json=data)
      self.assertEqual(r.status_code,200)
      self.assertEqual(r.json()['username'],'wuya')

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

     OK,在上面的python代码中,实现了对登录接口的验证和获取了它的token,当然关于mock server的详细的使用

  在http://www.cnblogs.com/weke/articles/6859021.html中对mock-server已经做了初步的介绍,今天这里继续接着之前的介绍进行,

我们先看之前的mock-server部分,之前编写了一个登录的mock,具体json文件见如下的内容:

[
  {
    "request":
    {
      "method":"post",
      "uri":"/login",
      "json":
      {
        "username":"admin",
        "password":"admin",
        "roleID":22
      }
    },
    "response":
    {
      "json":
      {
        "username":"wuya", 
        "userID":22, 
        "token":"asdgfhh32456asfgrsfss"
      }
    }
  }
]
 

查看上面的内容,我们可以看出,这样的方式并不是那么的友好,在UI或者接口的自动化测试中,我们知道在TDD的模式中,对数据进行分离,

这样也是为了维护的方便,这样的目的是为了后期自动化测试用例的扩展性,和它的易维护性,那么下来我们来对上面的json文件进行修改下,

对response部分的数据进行分离下,把它放在一个文件中,这样就可以分离了出来,我们把response的内容从login.json分离到login_response.json

切记login.json与login_response.json务必保持在同一个目录下,见login.json的内容:

[
  {
    "request":
    {
      "method":"post",
      "uri":"/login",
      "json":
      {
        "username":"admin",
        "password":"admin",
        "roleID":22
      }
    },
    "response":
    {
      "file":"login_response.json"
    }
  },
]

见login_response.json文件的内容:

{
  "username":"wuya",
  "userID":22,
  "token":"asdgfhh32456asfgrsfss"
}

执行login.json文件后,访问该接口,看是否OK,见执行login.json文件的命令:

使用postman查看该接口,看是否OK,见如下的截图:

      下面我们再进行一个业务,就是输入一个车牌号,查询该车牌号的显示时长,和它的停车费用,直接在loginjson文件中完善,见完善后的内容:

[
  {
    "request":
    {
      "method":"post",
      "uri":"/login",
      "json":
      {
        "username":"admin",
        "password":"admin",
        "roleID":22
      }
    },
    "response":
    {
      "file":"login_response.json"
    }
  },

  {
    "request":
    {
      "method":"post",
      "uri":"/parkinside",
      "json":
      {
        "token":"asdgfhh32456asfgrsfss",
        "vpl":"AJ3585"
      }
    },
    "response":
    {
      "file":"parkinside.json"
    }
  }
]

见parkinside.json文件的内容:

{
  "vplInfo":
  {
    "userID":22,
    "username":"wuya",
    "vpl":"京AJ3585"
  },
  "Parking time long":"20小时18分钟",
  "Parking fee":"20$"
}

见查询停车时长的接口请求的结果,见如下的postman截图:

       下面我们通过python语言,来对如上的二个接口进行实战的操作,切记parkinside的接口是在登录之后才可以操作的业务,

未登录操作该业务,返回502无效的token,见实现的代码:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import  unittest
import  requests
class MockTest(unittest.TestCase):
   def setUp(self):
      self.url='http://localhost:12306'
      
   def tearDown(self):
      pass
   
   def test_login(self,url='/login'):
      '''验证登录的接口'''
      data={
         "username":"admin",
         "password":"admin",
         "roleID":22
      }
      r=requests.post(self.url+url,json=data)
      self.assertEqual(r.status_code,200)
      self.assertEqual(r.json()['username'],'wuya')
      
   def getToken(self,url='/login'):
      '''登录成功后获取token'''
      data={
         "username":"admin",
         "password":"admin",
         "roleID":22
      }
      r=requests.post(self.url+url,json=data)
      return r.json()['token']
   
   def test_parkingside(self,url='/parkinside'):
      '''验证查询停车时长接口'''
      data={
         "token":self.getToken(),
         "vpl":"AJ3585"
      }
      r=requests.post(self.url+url,json=data)
      self.assertEqual(r.status_code,200)
      self.assertEqual(r.json()['Parking time long'],u'20小时18分钟')
      self.assertEqual(r.json()['Parking fee'], u'20$')
      
if __name__=='__main__':
   unittest.main(verbosity=2)

猜你喜欢

转载自www.cnblogs.com/jason89/p/9033779.html
今日推荐