pycharm-接口自动化测试

安装方式

  • 进入CMD》adb install 文件路径\.apk文件名
  • 也可采用以下命令的3种方式种的一种安装方式,进行操作
# 第一种
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

#第二种
python.exe -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

#第三种
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好后,可以查看下python的安装路径
 

  1. 进入CDM》python》import sys》sys.path  来查看
  2. 核对CMD页面查询到的路径和pycharm中解释器的路径,必须保持一致
  3. 再打开文件》设置》项目中的python解释器》点+按钮》搜索 requests 》点击安装软件包
  4. 等待完成后,即可引用requests使用编写了。

Fillder工具的使用
 

AutoResponder 》Enable rules》关闭

Filters》Use Filters》关闭

Tools》HOSTS 进入映射》勾选框选上》在其文本框填入 需要测试的接口地址,例如:local… shop.ecmlnil.cn


若是测试app端口,需要打开手机的 WLAN 进入,长按选择“手动”,填入  端口号、IP填入 “代理服务器主机名”,然后保存


在pycharm中的编写

import requests   #表示引入requests请求的编写方法
 requests.get()
 requests.post()   #requests可以引入请求方式 get 或者 post

python+ requests——自动化

  •  requests.post() —— http的post请求,返回Response对象
  •  requests.get() —— http的get请求
  •  Reponse 对象type —— 

        Reponse.status_code

        Reponse.headers

        Reponse.json()

#商品详情

  1. 测试用例中,使用接口地址url ,请求方式 post,数据内容是json 并填入测试接口 相应数据的值,格式,例如:"json":'测试接口相应数据的值'
  2. 这里的接口地址,使用url1 是接口地址的“变量名”,data1是 数据内容的“‘变量名”,变量名r1 是使用post请求方式把 url 和 data 集成后访问接口地址
  3. 这里是使用print()的输入显示语句,查看访问接口网址的响应状态码、响应头、响应体
  4. 最后 的  if 表示如果响应状态码是等于200 ,那么输出 ‘测试通过’
url1='http://localhost/ecmobile/?url=/goods'
data1={
    "json": '{"goods_id":33}'
}
r1=requests.post(url=url1,data=data1)
print(r1.status_code)
print(r1.headers)
print(r1.json())

if r1.status_code==200:
    print('测试通过')

1、status_code  —— 响应状态响应码,例如:若是成功则返回200

2、headers ——响应头

3、json() —— json响应体


import json
序列化

序列化是把响应体json内容较多是,以列的形式显示,便于查看响应体内容

  • 在响应体json中,succeed:0,表示请求失败
  • 在响应体json中,succeed:1,表示请求成功
print(json.dumps(r1.json(),indent=2,ensure_ascii=False))

dumps  —— 把python 数据转为json

indent —— 表示缩进1位,indent=2是缩进2个位

ensure_ascii ——是布尔型的显示,Ture 或者 False


sid1=r1.json()['data']['session']['sid']
uid1=r1.json()['data']['session']['uid']

使用变量名 sid1 和uid1 ,映射出响应体r1.json()中的 data目录下的session 目录下的 sid 和uid 的取值,便于后续自动化接口种引用 sid 和 uid 的值


#生成订单

import requests
from day2.购物车.用户信息 import sid,uid

# 添加到购物车
url1='http://localhost/ecmobile/?url=/cart/create'
data1={
    "json":'{"session":{"uid":"%s","sid":"%s"},"goods_id":1,"number":1}'%(uid,sid)
}
r1 = requests.post(url=url1,data=data1)

# 订单生成
url1='http://localhost/ecmobile/?url=/flow/done'
data1={
    "json":'{"shipping_id":"3","session":{"uid":"%s","sid":"%s"},"pay_id":"3"}'%(uid,sid)
}
# print(data1)
r1 = requests.post(url=url1,data=data1)
print('响应状态码',r1.status_code)
print('响应头',r1.headers)
print('响应体',r1.json())
import json
# 序列化
print(json.dumps(r1.json(),indent=2,ensure_ascii=False))

封装基础方法和信息,此文档命名为basemethod

import requests

# 封装基础方法和信息
import requests

# 服务器url
host1='http://localhost/ecmobile/?url='

# 基础get和post方法封装
def post(url,data):
    return requests.post(url=host1+url,data=data)

def get(url):
    return requests.get(url=host1+url)

# session中的sid和uid的封装
data1={
    "json":'{"name":"test7701","password":"111111"}'
}
r1=post(url='/user/signin',data=data1)
  • 定义变量名为 sid1 和 uid1 ,此内容是显示响应体中返回的 sid 和 uid 的值
sid1=r1.json()['data']['session']['sid']
uid1=r1.json()['data']['session']['uid']

每个接口的封装,此处文档命名为ecshopapi

里面的"%s"——代表占位符,语法格式,例如:'{"name":"%s","password":"%s"}'%(name,pwd)

# 每个接口的封装
from day2.basemethod import *

# 用户登录
def usersign(name,pwd):
    url1='/user/signin'
    data1={
        "json": '{"name":"%s","password":"%s"}'%(name,pwd)
    }
    return post(url=url1,data=data1)

添加到购物车,在文档命名为ecshopapi中

  1. 使用def(define)用来定义一个新的函数
  2. 因为我们是添加购物车,可以自定义为gouwuche 或者 如下面的 cartcreate 来命名
  3. 然后,按照接口文档,加上此项类的属性,这里的类属性,分别有goods_id,number,uid,sid
  4. 组成编写,即 def cartcreate(goods_id,number,uid,sid):
  5. url地址就是填写接口地址,这里使用 url1 作为 url接口地址的“变量名”,因为已经引用了前面文档的接口封装,所以这里的url 地址只要填写url=后面的内容/cart/create,不用填写完整的url地址;data1 作为 数据内容的“变量名”,里面的"%s"——代表占位符
  6. return 是指返回数值的意思,它可以选择性地返回一个值给调用方,语法格式“return [表达式]”,如果不带表达式则return返回的是None
  7. 组成编写,如下
# 每个接口的封装
from day2.basemethod import *

# 添加到购物车
def cartcreate(goods_id,number,uid,sid):
    url1='/cart/create'
    data1 = {
        "json": '{"session":{"uid":"%s","sid":"%s"},"goods_id":%s,"number":%s}' % (uid,sid,goods_id,number)
    }
    return post(url=url1,data=data1)

订单生成,在文档命名为ecshopapi中

# 每个接口的封装
from day2.basemethod import *

# 订单生成
def flowdone(shipping_id,pay_id,uid,sid):
    url1='/flow/done'
    data1 = {
        "json": '{"shipping_id":"%s","session":{"uid":"%s","sid":"%s"},"pay_id":"%s"}' % (shipping_id,uid, sid,pay_id)
    }
    return post(url=url1,data=data1)

 测试用例、测试数据、结果判定等

  • python中unittest模块是用来做单元测试的

  • Python中的assertEqual()是单元测试库函数,用于单元测试中以检查两个值的相等性

  1. 使用unittest 函数编辑,进行单元测试,from引入 之前名为ecshopapi 的文档 和basemethod 文档中的 sid 值  和 uid 值
  2. 使用 class 定义一个类 ,模块二购物车的测试用例 Test02 ,进行单元测试 用例 unittest.TestCase
  3. 使用 def 定义一个新的函数 :用例①——test01(self),用例①测试成功,则购物车输出“添加成功”
  4. 引用之前 ecshopapi 文档 定义的类的名 cartcreate 的响应体中 goods_id 、number、uid 、sid 的值(这里的响应体填写顺序必须 和 引用文档中的位置一致,否则会报错),并定义变量名为 r1
  5. 预期值都填写正确,那么用例执行是成功的,则响应体返回 succeed 值为1,即a=1
  6. 检查实际值的响应体 r1.json() 中 的succeed 值
  7. self.assertEqual()  检查预期值  和实际值  对比是否相等,若相等则表示成功,则响应体返回 succeed 值为1
  8. 查看响应体中,返回 succeed 值是否为1,若不为1则失败,需要查看具体错误原因,并记录bug
import unittest
from day2.ecshopapi import *
from day2.basemethod import sid1,uid1

class Test02(unittest.TestCase):
    """添加购物车接口"""
    def test01(self):
        print('用例1:添加成功')
        r1=cartcreate(1,1,uid1,sid1)
        a=1  # 预期
        b=r1.json()['status']['succeed']  # 实际
        self.assertEqual(a,b)
    def test02(self):
        print('用例2:库存不足')
        r1=cartcreate(1,2,uid1,sid1)
        a=0  # 预期
        b=r1.json()['status']['succeed']  # 实际
        self.assertEqual(a,b)
    def test03(self):
        print('用例3:下架商品')
        r1=cartcreate(31,1,uid1,sid1)
        a=0  # 预期
        b=r1.json()['status']['succeed']  # 实际
        self.assertEqual(a,b)

你可能感兴趣的:(python,json,开发语言)