基于Python的requests库实现接口自动化测试


1.什么是接口自动化测试

1.1概念

   接口测试:是对系统之间或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互的逻辑依赖关系。

 

  自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程。

 

  接口自动化测试:是让程序或工具代替人工自动完成对进行测试的这一过程。

 

1.2实现方式

  • 使用接口测试工具来实现,比如  JMeter、postman

  • 通过编写代码来实现  

 

1.3接口测试工具的不足(本文主要推崇以程序实现自动化测试)

  • 测试数据不好控制(工具中无法直接读取json格式数据)

  • 不方便测试加密接口
  • 扩展能力不足(复杂业务逻辑、复杂断言)

 

2.Requests库是什么?

2.1介绍

  

 

 2.2安装

pip  install  requests

 

 

 

 

 

 

3.接口请求方式

 

3.1GET请求
  

 

  无参数版

 

 

  含参数版

 

 

 

 

 3.2POST请求

 

 

   参数格式为json

 

  参数json与data的区别

python中的字典与json格式的数据,虽然外表没区别,但是数据序列化不一样;所以可以将字典通过json模块转成json字符串,再传到后台

 

 

 

 

 

   响应数据.text和响应数据.json()的区别

 

 

 

 3.3put请求方式

 

 

 

 3.4delete请求方式

 

 

 

3.5响应方法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 4.案例1

 需求

 

 

案例实现分析

 

 

 

 

 

 

 

 

 

 

 

 

 

5.基于Unittest框架接口自动化

5.1结构

class TestData(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_login_success(self):
        pass

    def test_username_not_exist(self):
        pass

    def test_password_error(self):
        pass

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.2古诗词网的自动化测试

云打码破解验证码

import http.client, mimetypes, urllib, json, time, requests


######################################################################

class YDMHttp:
    apiurl = 'http://api.yundama.com/api.php'
    username = ''
    password = ''
    appid = ''
    appkey = ''

    def __init__(self, username, password, appid, appkey):
        self.username = username
        self.password = password
        self.appid = str(appid)
        self.appkey = appkey

    def request(self, fields, files=[]):
        response = self.post_url(self.apiurl, fields, files)
        response = json.loads(response)
        return response

    def balance(self):
        data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey}
        response = self.request(data)
        if (response):
            if (response['ret'] and response['ret'] < 0):
                return response['ret']
            else:
                return response['balance']
        else:
            return -9001

    def login(self):
        data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey}
        response = self.request(data)
        if (response):
            if (response['ret'] and response['ret'] < 0):
                return response['ret']
            else:
                return response['uid']
        else:
            return -9001

    def upload(self, filename, codetype, timeout):
        data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}
        file = {'file': filename}
        response = self.request(data, file)
        if (response):
            if (response['ret'] and response['ret'] < 0):
                return response['ret']
            else:
                return response['cid']
        else:
            return -9001

    def result(self, cid):
        data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey, 'cid': str(cid)}
        response = self.request(data)
        return response and response['text'] or ''

    def decode(self, filename, codetype, timeout):
        cid = self.upload(filename, codetype, timeout)
        if (cid > 0):
            for i in range(0, timeout):
                result = self.result(cid)
                if (result != ''):
                    return cid, result
                else:
                    time.sleep(1)
            return -3003, ''
        else:
            return cid, ''

    def report(self, cid):
        data = {'method': 'report', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey, 'cid': str(cid), 'flag': '0'}
        response = self.request(data)
        if (response):
            return response['ret']
        else:
            return -9001

    def post_url(self, url, fields, files=[]):
        for key in files:
            files[key] = open(files[key], 'rb');
        res = requests.post(url, files=files, data=fields)
        return res.text


def getcode(username, pwd, codepath, codetype):
    # 用户名(普通用户)
    username = username

    # 密码
    password = pwd

    # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
    appid = 9360

    # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
    appkey = 'f4a739c9df9c63dfa7461bdb083a8a25'

    # 图片文件
    filename = codepath

    # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
    codetype = codetype

    # 超时时间,秒
    timeout = 30
    result = None
    # 检查
    if (username == 'username'):
        print('请设置好相关参数再测试')
    else:
        # 初始化
        yun_da_ma = YDMHttp(username, password, appid, appkey)

        # 登陆云打码
        uid = yun_da_ma.login()
        print('uid: %s' % uid)

        # 查询余额
        balance = yun_da_ma.balance()
        print('balance: %s' % balance)

        # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
        cid, result = yun_da_ma.decode(filename, codetype, timeout)
        print('cid: %s, result: %s' % (cid, result))
    return result

 

自动化测试古诗词网

import unittest import requests # 我们可能还会希望生成一个简单的HTML报告,可使用HTMLTestRunner实现。但pypi和官网上最新的都是只支持 # python2.x的0.8.2版本。可将以下代码自行保存成HTMLTestRunner.py放到自己项目目录下 import HTMLTestRunner from lxml import etree from yunda import getcode # 新建测试类 class TestData(unittest.TestCase): def setUp(self): # 获取session对象 self.session = requests.Session() # 登录url self.login_url = "https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx" page_text = requests.get(url=self.login_url).text tree = etree.HTML(page_text) # 验证码图片的url self.img_url = 'https://so.gushiwen.org' + tree.xpath('//*[@id="imgCode"]/@src')[0] def tearDown(self): # 关闭session self.session.close() def test_login_success(self): # 使用session获取验证码的cookies信息 self.session.get(url=self.img_url) # 请求登录 data = { "__VIEWSTATE": "9AsGvh3Je/0pfxId7DYRUi258ayuEG4rrQ1Z3abBgLoDSOeAUatOZOrAIxudqiOauXpR9Zq+dmKJ28+AGjXYHaCZJTTtGgrEemBWI1ed7oS7kpB7Rm/4yma/+9Q=", "__VIEWSTATEGENERATOR": "C93BE1AE", "from": "http://so.gushiwen.org/user/collect.aspx", "email": "1786887****", "pwd": "******", "code": getcode('****', 'yun25****', './img.jpg', 1004), "denglu": "登录" } r = self.session.post(url=self.login_url, data=data) try: # 断言 self.assertEqual(200, r.status_code) print("success login ") except AssertionError as e: print("登录出错:", e) def test_username_not_exist(self): pass def test_password_error(self): pass if __name__ == "__main__": suite = unittest.TestSuite() # TestData是要测试的类名,test_two是要执行的测试方法 suite.addTest(TestData("test_login_success")) suite.addTest(TestData("test_username_not_exist")) # runner = unittest.TextTestRunner() # runner.run(suite) filename = 'h:\\gu_shi_wen_wang.html' fb = open(filename, 'wb') runner = HTMLTestRunner.HTMLTestRunner(stream=fb,verbosity=2, title="测试HTMLTestRunner", description="测试HTMLTestRunner") runner.run(suite) fb.close()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM