背景
日常服务上线后, 通常会在客户端跑一下新增或更新的功能来验证接口功能是否正常, 绝大问题情况下问题不大. 但是有时候逻辑改动较多, 特别是代码重构后, 需要将主要功能都测一遍, 比较费时费力. 所以想使用自动化测试工具来辅助进行全流程测试, 研究发现 robot framework还算是一个相当成熟的测试框架, 于是花一点时间实践起来. robot framework 基于python 实现, 相关的工具库比较丰富, 支持移动端, web 端, 桌面端测试. 话不多说, 直接上官方文档: robotframework.org/robotframew…
安装
- 准备好python 环境, 使用 pip安装 robotframework
pip install robotframework
- 安装好后, 就可以执行 robot 命令了, # robot xxxx.robot
- 安装外部库 (外部库可以在官网找到, robotframework.org/?tab=librar…)
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