使用robot framework进行接口自动化测试

490 阅读2分钟

背景

日常服务上线后, 通常会在客户端跑一下新增或更新的功能来验证接口功能是否正常, 绝大问题情况下问题不大. 但是有时候逻辑改动较多, 特别是代码重构后, 需要将主要功能都测一遍, 比较费时费力. 所以想使用自动化测试工具来辅助进行全流程测试, 研究发现 robot framework还算是一个相当成熟的测试框架, 于是花一点时间实践起来. robot framework 基于python 实现, 相关的工具库比较丰富, 支持移动端, web 端, 桌面端测试. 话不多说, 直接上官方文档: robotframework.org/robotframew…

安装

  • 准备好python 环境, 使用 pip安装 robotframework
pip install robotframework
pip install robotframework-requests # http请求用
robotframework-jsonlibrary # json库
  • 另外, 可以安装相关vscode插件, 这样在 vscode 中编写测试用例就非常方便了, 我们选择安装 Robot Framework Language Server

编写测试用例

  • 定义变量与关键字
# resource.robot

*** Settings ***
Library    RequestsLibrary
Library    JSONLibrary
Library    Collections

*** Variables ***
${ENV}    Beta
${CoocaaToken}    2.c3ba911397394662b169f09ec7e08ecb
${BaseURL}   https://beta-api-coshare.ccss.tv
${AccessToken}    ccaa10044e594f0195d7b29131c8e86b
${Appkey}    f3c910397cb5495684f5d020994bd553
${UserDid}    robot-test-01
${UserPlatform}    ${1}

*** Keywords ***
On Suite Setup
    # ${BaseURL}=    Set Global Variable   ${ENV} == 'Prod'    "https://api-coshare.ccss.tv"
    Create Session    miteeSession    ${BaseURL}    headers={'cPkg':'robot-for-mitee', 'Content-Type':'application/json'}    verify=true
    Login
    PrintUserInfo
    Log    $

Login
    ${data}=    Create Dictionary    login_type=${1}    auth_token=${CoocaaToken}    platform=${UserPlatform}    did=${UserDid}
    ${resp}=    POST On Session    miteeSession    /mitee/account/login     params=appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}
    Set Global Variable    ${AccessToken}    ${resp.json()}[data][access_token]
    Log Variables

PrintUserInfo
    [Tags]    Smoke Test
    ${resp}=    GET On Session    miteeSession    /mitee/account/user-info    params=access_token=${AccessToken}&appkey=${Appkey}    expected_status=200
    CheckResp    ${resp}
    Log    ${resp.json()}[data]

CreateRoom
    ${data}=    Create Dictionary    room_type=${1}    topic=robot-test
    ${resp}=    POST On Session    miteeSession    /mitee/room/create    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}
    RETURN    ${resp.json()}[data][room_id]

DestroyRoom
    [Arguments]    ${room_id}
    ${data}=    Create Dictionary    room_id=${room_id}
    ${resp}=    POST On Session    miteeSession    /mitee/room/destroy    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}
    
PrintRoomShareURL
    [Arguments]    ${room_id}
    ${resp}=    GET On Session    miteeSession    /mitee/room/share-url    params=access_token=${AccessToken}&appkey=${Appkey}&room_id=${room_id}    expected_status=200
    CheckResp    ${resp}
    Log    full_text: ${resp.json()}[data][full_text]

JoinActivity
    [Arguments]    ${room_id}
    ${data}=    Create Dictionary    room_id=${room_id}
    ${resp}=    POST On Session    miteeSession    /mitee/room/activity/join    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}
    ${activity_id}=    Set Variable    ${resp.json()}[data][activity_id]
    Log    ${activity_id}
    RETURN    ${activity_id}

PrintActivityMemberList
    [Arguments]    ${activity_id}
    ${resp}=    GET On Session    miteeSession    /mitee/room/activity/member-list    params=access_token=${AccessToken}&appkey=${Appkey}&activity_id=${activity_id}    expected_status=200
    CheckResp    ${resp}
    ${member_list}=    Set Variable    ${resp.json()}[data]
    ${len}=    Get Length    ${member_list}
    Log    member.len: ${len}
    FOR    ${ele}    IN    @{member_list}
        Log    ${ele}[uid] ${ele}[did] ${ele}[platform]
    END

InviteMember
    [Arguments]    ${room_id}    ${miitee_id}
    ${data}=    Create Dictionary    room_id=${room_id}    invite_type=${2}    miitee_id=${miitee_id}
    ${resp}=    POST On Session    miteeSession    /mitee/room/invite-member    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}

KickoutActivityMember
    [Arguments]    ${activity_id}    ${member_id}
    ${data}=    Create Dictionary    activity_id=${activity_id}    member_id=${member_id}
    ${resp}=    POST On Session    miteeSession    /mitee/room/activity/kickout-member    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}

ShareMedia
    [Arguments]    ${room_id}    ${media_uri}    ${media_state}    
    ${data}=    Create Dictionary    room_id=${room_id}    media_uri=${media_uri}    media_state=${media_state}
    ${resp}=    POST On Session    miteeSession    /mitee/room/media/share    params=access_token=${AccessToken}&appkey=${Appkey}&version=2    json=${data}    expected_status=200
    CheckResp    ${resp}

    ${media_id}=    Set Variable    ${resp.json()}[data][id]
    Log    media_id: ${media_id}
    RETURN    ${media_id}

StopMedia
    [Arguments]    ${media_id}
    ${data}=    Create Dictionary    id=${media_id}
    ${resp}=    POST On Session    miteeSession    /mitee/room/media/stop-share    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}    expected_status=200
    CheckResp    ${resp}

RandomShareMediaAndDelay
    [Arguments]    ${room_id}    ${media_state}    ${delay}
    ${media_uri}=    CreateMediaURI
    ${media_state}=    Create Dictionary    scale=${1}
    ${media_state_str}=    Convert Json To String    ${media_state}
    ShareMedia    ${room_id}    ${media_uri}    ${media_state_str}
    Sleep    ${delay}
    
GetShowingMediaList
    [Arguments]    ${room_id}
    ${resp}=    GET On Session    miteeSession    /mitee/room/media/showing-media-list    params=access_token=${AccessToken}&appkey=${Appkey}&room_id=${room_id}    expected_status=200
    CheckResp    ${resp}
    ${media_list}=    Set Variable    ${resp.json()}[data]
    FOR    ${ele}    IN    @{media_list}
        Log    ${ele}[id] ${ele}[media_uri] 
    END

CreateWhiteboard
    [Arguments]    ${room_id}
    ${resp}=    POST On Session    miteeSession    /mitee/whiteboard/create    params=access_token=${AccessToken}&appkey=${Appkey}&room_id=${room_id}    expected_status=200
    CheckResp    ${resp}
    Log    ${resp.json()}[data][wb_room_id]


CreateMediaURI
    ${file_list}=    GetNetdiskFileList
    ${file_list_len}=    Get Length    ${file_list}
    IF    ${file_list_len} <= ${0}
        RETURN    
    END
    ${idx}=    Evaluate    random.randint(0, ${file_list_len})
    Log    media idx: ${idx}
    ${file}=    Get From List    ${file_list}    ${idx}
    Log    media file: ${file}
    
    ${token}=    CreateFileShareToken    ${file}[file_key]
    ${scheme}=    Set Variable  document
    ${file_content_type}=    Set Variable    ${file}[content_type]
    
    IF    ${file_content_type.startswith('image')}
        ${scheme}=    Set Variable    image
    ELSE IF    ${file_content_type.startswith('video')}
        ${scheme}=    Set Variable    video
    END
    RETURN    ${scheme}://miitee/?src=${token}&platform=${UserPlatform} 


GetNetdiskFileList
    ${resp}=    GET On Session    miteeSession    /netdisk/v1/file/list    params=access_token=${AccessToken}&appkey=${Appkey}&mode=personal&page_size=20    expected_status=200
    CheckResp    ${resp}
    RETURN    ${resp.json()}[data][list]

CreateFileShareToken
    [Arguments]    ${file_key}
    ${data}=    Create Dictionary    file_key=${file_key}
    ${resp}=    POST On Session    miteeSession    /netdisk/v1/file/create-share-url    params=access_token=${AccessToken}&appkey=${Appkey}    json=${data}     expected_status=200
    CheckResp    ${resp}
    RETURN    ${resp.json()}[data][token]

CheckResp
    [Arguments]    ${resp}
    # Should Be Equal As Integers    0    ${resp.json()}[code]
    IF    ${resp.json()}[code] != ${0}
        Fail    resp check failed, code:${resp.json()}[code] msg: ${resp.json()}[msg]
    END
  • 编写测试用例
# api-test.robot

*** Settings ***
Resource    resource.robot
Library    Dialogs
Suite Setup    On Suite Setup

*** Test Cases ***
Test room apis
    [Tags]     Smoke Test
    ${room_id}=    CreateRoom
    Log     room_id: ${room_id}
    Sleep    2s

    PrintRoomShareURL    ${room_id}
    
    ${activity_id}=     JoinActivity    ${room_id}
    Log    activity_id: ${activity_id}
    Sleep    1s
    PrintActivityMemberList    ${activity_id}

    ${miitee_id}=    Get Value From User    input invite member miitee_id:    
    Log    miitee_id: ${miitee_id}
    InviteMember    ${room_id}    ${miitee_id}
    Sleep    3s
    PrintActivityMemberList    ${activity_id}

    Sleep    2s
    CreateWhiteboard    ${room_id}

    Sleep    2s
    ${media_state}=    Create Dictionary    scale=${1}
    ${media_state_str}=    Convert Json To String    ${media_state}
    Repeat Keyword    5 times    RandomShareMediaAndDelay    ${room_id}    ${media_state_str}    10s

    Log To Console    Room will destroyed after 5s
    Sleep    10s
    DestroyRoom    ${room_id}
  • 接下来就可以执行测试用例了
robot api-test.robot