遠端電源測試
遠端電源模擬
由於我們沒有真正的遠端電源硬體,我們將使用 python 程式對其進行模擬。
關於 RPS 的基本思路
- 實際上遠端電源有一個 http 伺服器。
- 使用者可以使用 http 請求傳送命令以開啟/關閉電源。
我們將使用以下程式 rps-server.py 模擬遠端電源。
from flask import Flask, request
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()
users = {
'admin': '12345678'
}
app.url_map.strict_slashes = False
PINS = ['P60', 'P61', 'P62', 'P63']
PINS_STATUS = {'P60':'0', 'P61': '0', 'P62':'0', 'P63':'0'}
@auth.get_password
def get_pw(username):
if username in users:
return users.get(username)
return None
@app.route('/')
@auth.login_required
def index():
return "Hello, %s!" % auth.username()
def get_html_string():
html_str = '<html>P60={}P61={}P62={}P63={}</html>'.format(PINS_STATUS['P60'],
PINS_STATUS['P61'],
PINS_STATUS['P62'],
PINS_STATUS['P63'])
return html_str
def parse_cmd_args(args):
global current_status
if str(args['CMD']) == 'SetPower':
for key in args:
if key in PINS:
PINS_STATUS[key] = str(args[key])
return get_html_string()
if str(args['CMD']) == 'GetPower':
return get_html_string()
@app.route('/SetCmd', methods=['GET','POST'])
def rps():
if request.method=="GET":
args=request.args.to_dict()
ret = parse_cmd_args(args)
return ret
上面的程式碼實際上模擬了 http 伺服器來控制遠端電源。
如何執行 RPS 伺服器?
$ export FLASK_APP=rps-server.py
$ flask run
如何將命令傳送到 rps 伺服器?
以下是用於控制 RPS 的兩個命令
- SetPower
- 得到力量
預設情況下,伺服器將在埠 5000 處進行偵聽。
電源埠是,
- P60
- P61
- P62
- P64
埠的狀態是,
- ON - 1
- 關 - 0
要求
建設遠端電源的要求是
- 遠端電源應能夠遠端開啟/關閉
- 可以遠端訪問遠端供電狀態。
匯出測試用例
來自需求的測試用例
- 遠端開啟電源 2。
- 確認電源 2 已開啟。
- 遠端關閉電源 2。
- 確認電源 2 已關閉。
手動測試
- 執行 rps 伺服器。
- 要開啟埠 3,請開啟瀏覽器並提供以下 URI
http://admin:12345678@localhost:5000/SetCmd?CMD=SetPower&P62=1
- 獲取所有埠的狀態
http://admin:12345678@localhost:5000/SetCmd?CMD=GetPower
編寫測試庫
我們需要在 python 中編寫一個測試庫,用於使用 http 請求傳送 http 命令。稍後我們將使用此庫作為機器人框架工作中的關鍵字。
commands.py
我們將使用來自 commands.py 的庫來傳送 SetPower 和 GetPower。
import requests
import re
class commands(object):
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
def __init__(self, ip='localhost:5000'):
self.ip_address = ip
self.query = {}
self.user = 'admin'
self.passw = '12345678'
def form_query(self, state, cmd, port):
port = self.get_port_no(port)
self.query = {port: state}
return self.query
def get_port_no(self, port_no):
port = 'P6' + str(port_no)
return port
def clean_html(self, data):
exp = re.compile('<.*?>')
text = re.sub(exp, "", data)
return text.rstrip()
def send_cmds(self, cmd, port=None, state=None):
url = 'http://{}:{}@{}/SetCmd?CMD={}'\
.format(self.user,
self.passw,
self.ip_address,
cmd)
print url
if cmd == 'SetPower':
self.form_query(state, cmd, port)
self.req = requests.get(url, params=self.query)
return True
elif cmd == 'GetPower':
self.req = requests.get(url)
data = self.clean_html(self.req.text)
return data
else:
return False
return self.req.text
# c = commands('localhost:5000')
# c.send_cmds('SetPower', 2, 1)
# c.send_cmds('SetPower', 3, 1)
# print c.send_cmds('GetPower')
Python 關鍵詞文件
send_cmds(cmd, port=None, state=None)
是我們將要使用的功能。- 在 Robot 關鍵詞中使用此功能時,無需在功能名稱中關注
_
或Lowercaser
或Uppercase
。
使用 as 關鍵字時,Python 函式將如下所示
Send Cmds cmd port state
編寫測試關鍵詞
我們將在測試套件中使用 Send Cmds
作為 python 關鍵字。
-
RPS 傳送命令使用以下四個引數來設定功率
- command = SetPower
- port = 2
- state = 1 表示 ON / 0 表示關閉當我們呼叫該命令時,它將開啟/關閉電源
-
RPS 獲得電源將返回所有電源埠的狀態
### Keywords
RPS send commands
[Arguments] ${command} ${port} ${state}
${output}= Send cmds ${command} ${port} ${state}
[return] ${output}
RPS get Power
[Arguments] ${command}
${output}= Send cmds ${command}
[return] ${output}}
測試電源的演算法
- 設定埠電源
- 檢查 cmd 的狀態
- 獲取埠的狀態並檢查它是否為 ON / OFF
使用上述關鍵詞編寫測試用例
現在我們準備使用以下兩個關鍵字編寫測試用例
- RPS 傳送命令 - 設定和取消設定埠電源
- RPS 獲得電力 - 獲取所有埠的狀態
### Settings
Library commands.py
### Test Cases
Turn on Power supply 2 remotely
${out}= RPS send commands SetPower 2 1
Should be equal ${out} ${True}
Verify power supply 2 is on
${out}= RPS get power GetPower
should contain ${out} P62=1
Turn off Power supply 2 remotely
${out}= RPS send commands SetPower 2 0
Should be equal ${out} ${True}
Verify power supply 2 is off
${out}= RPS get power GetPower
should contain ${out} P62=0
建立檔名 remote-power-supply.robot
將關鍵字和測試用例複製到檔案中。
如何執行 RPS 伺服器和遠端電源。機器人?
- 首先執行遠端電源
- 執行測試套件 remote-power-supply.robot
$ export FLASK_APP=rps-server.py
$ flask run
$ pybot remote-power-supply.robot
輸出
$ pybot remote-pwer-supply.robot
==============================================================================
Remote-Pwer-Supply
==============================================================================
Turn on Power supply 2 remotely | PASS |Verify power supply 2 is on | PASS |Turn off Power supply 2 remotely | PASS |Verify power supply 2 is off | PASS |
------------------------------------------------------------------------------
Remote-Pwer-Supply | PASS |
4 critical tests, 4 passed, 0 failed
4 tests total, 4 passed, 0 failed
==============================================================================
Output: /tmp/talks/robot-framework-intro/test-cases/output.xml
Log: /tmp/talks/robot-framework-intro/test-cases/log.html
Report: /tmp/talks/robot-framework-intro/test-cases/report.html
以下兩個圖解釋了 RPS 和 RF 之間的測試架構
遠端電源測試架構
機器人框架工作架構
積分
感謝架構圖的機器人框架。