自動生成robot自動化測試用例


背景:java項目使用swagger管理接口,隨着需求的開發接口也有增加,要從swagger界面中去查找出新增的接口是件很費時,效率很低的事情. 

適用情況: java項目且適用swagger管理接口

腳本解析:

  1. 使用requests包調用swagger的api-docs接口(http://localhost/api/v1/api-docs),此接口會返回swagger中所有接口的模塊名,url,接口名字,參數名,參數描述,案列值等相關信息
  2. 解析上面接口的返回值組裝成自動化測試用例並寫入指定文件中,且寫入前會判斷此接口的url是否在文件中已存在,存在則表示此接口已經實現自動化,不會重復寫入.

使用方法:

一. 打開腳本修改filename和url參數的默認值為對應項目robot工程的文件名和swagger的api-docs接口的url后直接在Python編輯器中運行此文件.

二. 在cmd窗口中進入到腳本和robot工程目錄執行命令: python AutoCreateRobotCase.py robot.txt http://localhost/api/v1/api-docs (robot.txt和后面的url修改為對應項目的值)

執行完后新增的用例會在robot工程文件中關鍵字后面,所以需要將用例設置好對應參數的值后移動到關鍵字上面

 

執行后生成的自動化用例如下:

 

 

#!/usr/bin/env python
"""解析swagger接口返回值自動生成接口自動化用例
   將新增的用例寫入到文件末尾,已存在的用例則不重新寫入
"""

import requests
import json
import sys


def auto_create_robotcase(filename='robot.txt', url='http://localhost/v2/api-docs'):
    try:
        f = open(filename, 'a+', encoding='utf-8')
        f.seek(0, 0)
        content = f.read()
        f.write('\n')
        f.write('\n')
        f.write('\n')
        r = requests.get(url)
        print(r.text)
        # 將返回的文本轉換成json格式,並取paths部分的值,因為這個部分包含了所有需要的信息
        api_docs = json.loads(r.text)
        paths = api_docs['paths']
        definitions = api_docs['definitions']
        k = 1
        print(len(paths.items()))
        for i in paths.items():
            print(i)
            interface_api = i[0]
            if interface_api in content:
                continue
            interface_type = list(i[1].keys())[0]
            mode_name = dict(list(i[1].values())[0])['tags'][0]
            interface_name = dict(list(i[1].values())[0])['summary']
            print(str(mode_name) + "模塊下第" + str(k) + "個接口為:" + str(interface_name) + "  類型為:" + str(
                interface_type) + "  URI:" + str(interface_api))
            head = []
            data = []
            if list(i[1].values())[0].__contains__('parameters'):
                params = dict(list(i[1].values())[0])['parameters']
                for param in params:
                    param_name = param['name']
                    param_position = param['in']
                    param_required = param['required']
                    print("參數名:", param_name, "參數位置:", param_position, "必填否:", param_required)
                    # 有些參數沒有描述字段,這里做個判斷,有的時候取描述,沒有賦空值
                    if param.get('description'):
                        param_description = param['description']
                    else:
                        param_description = ''
                    if param_required:
                        if param_position == 'header':
                            pa = param_name + "=" + param_description
                            head.append(pa)
                        elif param_position == 'query':
                            pa = param_name + "=" + param_description
                            data.append(pa)
                        elif param_position == 'body':
                            param_schema = param['schema']
                            if param_schema.get('items'):
                                define_name = param_schema['items']['$ref'].split('/')[-1]
                            else:
                                define_name = param_schema['$ref'].split('/')[-1]
                            data = definitions[define_name]['properties']
            case_name = mode_name + "-" + interface_name
            f.write(case_name + '\n')
            head_s = ""
            for i in head:
                head_s = head_s + "    " + str(i)
            if head_s:
                create_head = '    ${headers}    Create Dictionary    Content-Type=${Content-Type}    Accept=${Accept}' + head_s
            else:
                create_head = '    ${headers}    Create Dictionary    Content-Type=${Content-Type}    Accept=${Accept}'
            f.write(create_head + '\n')
            create_api = '    Create Session    api    ${host}    ${headers}'
            f.write(create_api + '\n')
            if str(data).startswith("{"):
                create_data = '    ${data}    Set Variable    ' + str(data)
            else:
                data_s = ''
                for i in data:
                    data_s = data_s + '    ' + str(i)
                create_data = '    ${data}    Create Dictionary    ' + data_s
                create_params = '    ${params}    Create Dictionary    ' + data_s
            create_get_request = '    ${result}    Get Request    api    ' + interface_api + '    params=${params}'
            create_get_request_noparams = '    ${result}    Get Request    api    ' + interface_api
            create_post_request = '    ${result}    Post Request    api    ' + interface_api + '    data=${data}'
            create_post_request_noparams = '    ${result}    Post Request    api    ' + interface_api
            if interface_type == 'get':
                if data:
                    f.write(create_params + '\n')
                    f.write(create_get_request + '\n')
                else:
                    f.write(create_get_request_noparams + '\n')
            else:
                if data:
                    f.write(create_data + '\n')
                    f.write(create_post_request + '\n')
                else:
                    f.write(create_post_request_noparams + '\n')
            create_response = '    ${response}    Set Variable    ${result.content}'
            create_response_to_json = '    ${response}    To Json    ${response}'
            create_assert_code = '    should be equal as integers    ${response["code"]}    200'
            create_assert_msg = '    should be equal    ${response["msg"]}    操作成功'
            f.write(create_response + '\n')
            f.write(create_response_to_json + '\n')
            f.write(create_assert_code + '\n')
            f.write(create_assert_msg + '\n')
            f.write('\n')
            k = k + 1
        f.close()
    except Exception as e:
        raise e


if __name__ == "__main__":
    if len(sys.argv) == 1:
        auto_create_robotcase()
    else:
        auto_create_robotcase(sys.argv[1], sys.argv[2])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM