RF REST接口测试自定义方法

1,自定义接口json

{
  "url": "http:xxxxxxxxxx",
  "method": "POST",
  "body": {
    "username": "name",
    "password": "pwd"
  }
}

2、请求处理方法类

注:以下方法主要有update和delete方法中修改url然后发送请求,其余post和get请求关注requrl方法即可

# coding = utf-8
import pytesseract
from PIL import Image
from selenium import webdriver
import selenium
import time
import json
import requests


class Base_login():
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
          }

    def __init__(self):
        pass

    # def mark(self, f):
    #     def warpars(**kwargs):
    #         print('%s is start!'.center(100, '=') % f)
    #         f()
    #         print('%s is end!'.center(100, '=') % f)
    #         return f()
    #     return warpars()

    def check_login(self, url, username, passwd, img_dir='D:\payimg'):
        '''
        :param url:
        :param username:
        :param passwd:
        :param img_dir:
        :return: jesssid  token
        '''
        i = 1
        while i < 4:
            driver = webdriver.Chrome()
            driver.set_window_size(1200, 900)
            time.sleep(2)
            driver.get(url)
            time.sleep(1)
            # save image to img_dir
            driver.get_screenshot_as_file(img_dir + '\\checkcode.png')
            # transfer checkcode
            img = Image.open(img_dir + '\\checkcode.png')
            # box = (836, 368, 939, 402)
            box = (765, 315, 855, 345)
            codeshot = img.crop(box)
            codeshot.save(img_dir + '\\code.png')
            checkcode = pytesseract.image_to_string(codeshot).replace(" ", "")
            print('The checkcode is:', checkcode)
            # input login info
            driver.find_element_by_xpath('//*[@id="loginAccount"]').send_keys(username)
            driver.find_element_by_xpath('//*[@id="password"]').send_keys(passwd)
            driver.find_element_by_xpath('//*[@id="randCode"]').send_keys(checkcode)
            driver.find_element_by_xpath('//*[@id="btn_login"]').click()
            time.sleep(6)
            try:
                driver.find_element_by_xpath('//*[@id="page-wrapper"]/div[1]/nav/div/a')
                break
            except selenium.common.exceptions.NoSuchElementException:
                print('failed to catch checkcode %s' % i)
                driver.quit()
            i = i + 1
        cookieL = driver.get_cookies()
        htmlS = driver.page_source
        print(cookieL)
        tokenp = htmlS.split('\n')[2].strip(' ')
        print(tokenp)
        assert len(tokenp) > 1, 'Get token failed'
        token = tokenp.split(' ')[2].split('=')[1].strip('\"')
        print('====%s====' % token)
        session = cookieL[0].setdefault('value')
        print(session)
        driver.quit()
        return session, token

    def set_header(self, jessionid, token=''):
        """
        Prepar the request headers for request
        :param jessionid: session
        :param token: token
        :return: headers
        """
        cook = 'JSESSIONID=' + jessionid
        Base_login.headers['Cookie'] = cook
        Base_login.headers['X-CSRF-TOKEN'] = token
        header = Base_login.headers
        print('The request headers is:', header)
        return header

    def set_params(self, jsonf, **kwargs):
        """
        load jsonf and return data dict
        :param jsonf: json file
        :param kwargs: need to modify params
        :return: data dict
        """
        with open(jsonf, 'r') as jp:
            jdata = json.loads(jp.read())
        print('data is:', jdata)
        data = jdata["body"]
        print(kwargs)
        if len(kwargs) != 0:
            for wrg in kwargs:
                assert wrg in data, 'Params error! do not in json file!'
                data[wrg] = kwargs[wrg]
        print('new data is:', jdata)
        return jdata

    def reqUrl(self, jsonf, jessionid, token='', **kw):
        """
        Useage: The common request method ,it can be used for send all post and get request!
        :param jsonf: json file
        :param jessionid: sessionid
        :param token: token
        :return: json string of response
        """
        jdata = Base_login.set_params(self, jsonf, **kw)
        headers = Base_login.set_header(self, jessionid, token=token)
        print(jdata)
        url = jdata["url"]
        data = jdata["body"]
        print('The request method is:', jdata["method"])
        if jdata["method"] == 'POST':
            resp = requests.post(url, data=data, headers=headers)
        else:
            resp = requests.get(url, params=data, headers=headers)
        assert resp.status_code == 200, 'requests is bad, request code is: %s' % resp.status_code
        print(resp.json())
        return resp.json()

    def deal_result(self, resp, id):
        """
        deal with resp and return need datalist
        :param resp: response of inquire result
        :param id: param for you need
        :param kwargs:
        :return:
        """
        print(type(resp))
        if type(resp) == 'str':
            print('111')
            redic = json.loads(resp.decode('utf-8'))
        else:
            redic = resp
        datalist = redic['data']['dataList']
        idlist = []
        for data in datalist:
            if id in data:
                idlist.append(data[id])
        print('id list is:', idlist)
        if len(idlist) == 1:
            return idlist[0]
        else:
            return idlist

    def get_datavalue(self, resp, key):
        # print(type(resp))
        if type(resp) == 'str':
            print('111')
            redic = json.loads(resp.decode('utf-8'))
        else:
            redic = resp
        datalist = redic['data']['dataList']
        value = datalist[0][key]
        print(value)
        return value

    def delorupdate(self, jsonf, updateid, jessionid, model='update', token='', **kwargs):
        """
        if request is del or update ,updata spacial json file.
        :param jsonf: update json file
        :param updateid: modify id
        :param model: update or del
        :param kwargs: update keyword
        :return:
        """
        headers = Base_login.set_header(self, jessionid, token=token)
        with open(jsonf, 'r') as jp:
            datad = json.loads(jp.read())
        print('data is:', datad)
        updateid = str(updateid)
        datad['url'] = datad['url'].replace('modifyid', updateid)
        print('url is:', datad['url'])
        if model == 'update':
            datad['body'] = {}
            for updated in kwargs:
                datad['body'][updated] = kwargs[updated]
            resp = requests.post(datad['url'], data=datad['body'], headers=headers)
        else:
            resp = requests.post(datad['url'], headers=headers)
        print('new data is:', datad)
        assert resp.status_code == 200, 'request faild!'
        print(resp.json())
        return resp.json()


if __name__ == '__main__':
    bl = Base_login()
    fp = '../Test_data/json/system/inquireuser.json'
    fd = '../Test_data/json/system/deleteuser.json'
    jess, token = bl.check_login(r'http:xxxxxxx/login', 'admin', '123456')
    resp = bl.reqUrl(fp, jess, token, mvnoCode='autotest1')
    dl, idl = bl.deal_result(resp, 'userId')
    rr = bl.delorupdate(fd, idl[0], jess, 'delete', token)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RF接口自动化测试是指使用Robot Framework(简称RF)进行的接口自动化测试。在进行RF接口自动化测试时,需要掌握一些基础知识和技巧。 首先,要了解RF的基本概念和用法。RF是一种开源的,基于关键字驱动的测试框架,支持Python语言编写测试用例。它提供了丰富的库和关键字,方便编写、维护和扩展测试脚本。 在RF接口自动化测试中,需要使用HTTP库或者比较流行的第三方库如Requests库来发送HTTP请求,并解析返回的结果。可以通过编写关键字来封装这些操作,方便进行测试用例的编写和维护。 其次,要了解接口测试的基本原理和流程。对于每个接口,需要先明确测试目标和约束条件,然后设计测试用例,包括输入数据和预期结果。通过RF提供的关键字,可以执行测试用例,并比较实际结果和预期结果,判断接口是否正确。 在RF接口自动化测试中,还需要考虑一些常见的问题和注意事项。例如,如何处理接口依赖关系和参数化测试、如何处理错误和异常情况、如何生成测试报告和日志等。可以借助RF提供的库和关键字,来解决这些问题,并提高测试效率和质量。 最后,要了解RF接口自动化测试的发展趋势和扩展领域。随着互联网的发展,接口测试变得越来越重要。对于RF接口自动化测试,可以考虑与其他测试技术和工具的集成,如数据库测试、性能测试、安全测试等,以提供更全面的测试覆盖和更高的测试效率。 总之,RF接口自动化测试是一种灵活、高效的测试方法,可以帮助我们快速、准确地发现接口中的问题。掌握RF接口自动化测试需要掌握RF框架的基本概念和用法,了解接口测试的原理和流程,并学会解决常见问题和扩展领域。通过不断学习和实践,我们可以提高自己的RF接口自动化测试水平,为软件质量的提升做出贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值