遠端電源測試

遠端電源模擬

由於我們沒有真正的遠端電源硬體,我們將使用 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 的兩個命令

  1. SetPower
  2. 得到力量

預設情況下,伺服器將在埠 5000 處進行偵聽。

電源埠是,

  1. P60
  2. P61
  3. P62
  4. P64

埠的狀態是,

  1. ON - 1
  2. 關 - 0

要求

建設遠端電源的要求是

  1. 遠端電源應能夠遠端開啟/關閉
  2. 可以遠端訪問遠端供電狀態。

匯出測試用例

來自需求的測試用例

  1. 遠端開啟電源 2。
  2. 確認電源 2 已開啟。
  3. 遠端關閉電源 2。
  4. 確認電源 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 關鍵詞文件

  1. send_cmds(cmd, port=None, state=None) 是我們將要使用的功能。
  2. 在 Robot 關鍵詞中使用此功能時,無需在功能名稱中關注 _LowercaserUppercase

使用 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}}

測試電源的演算法

  1. 設定埠電源
  2. 檢查 cmd 的狀態
  3. 獲取埠的狀態並檢查它是否為 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 之間的測試架構

遠端電源測試架構

StackOverflow 文件

機器人框架工作架構

StackOverflow 文件

積分

感謝架構圖的機器人框架。

完整的程式碼可在此處獲得

遠端供電

commands.py

遠端電源 supply.robot