机器人框架套件安装和插座

2024-10-02 18:15:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Robot框架测试服务器应用程序(gdbserver实现)。我的测试套件将测试基本命令,即步骤、下一步、断点等。所以我的想法是在suitesetup函数中设置连接,然后在测试用例中使用该连接

*** Settings ***
Library  RSPLibrary.py

Suite Setup  Connect to server

*** Keywords ***
Expect data
    [Arguments]  ${exp}
    ${resp} =  Rec data
    Should be equal as strings  ${resp}  ${exp}

Connect to server
    Connect  127.0.0.1  8080

*** Test Cases ***
Server understands command H
    Send data  Hg-0
    Expect data  OK

Server understands command ?
    Send data  ?
    Expect data  OK

我的回复库是这样的

import socket
import re

class RSPLibrary(object):

    def __init__(self):
        print("RSPLibrary initiated")
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def connect(self, adr, port):
        print("Connect to server")
        self.sock.connect(('localhost', 8080))
        print("Connected to server", self.sock)

    def checksum_str(self, data):
        checksum = sum(bytearray(data, 'utf-8')) % 256
        return hex(checksum >> 4)[2:] + hex(checksum & 0xf)[2:]

    def send_sock(self, data):
        print("Send", self.sock)
        self.sock.send(data)

    def recv_sock(self):
        return self.sock.recv(256)

    def send_data(self, data):
        strToSend = "$" + data + "#" + self.checksum_str(data)
        numResend = 0
        self.send_sock(strToSend)
        while(self.recv_sock() != '+'):
            self.send_sock(strToSend)

    def rec_data(self):
        data = self.recv_sock()
        mo = re.search(r".*\$(.*)\#([0-9a-fA-F]{2})", data)
        (data, checksum) = (mo.group(1), mo.group(2))
        while(self.checksum_str(data) != checksum):
            self.send_sock("-")
            data = self.recv_sock()
        self.send_sock("+")
        return mo.group(1)

我遇到的问题是在执行测试用例时出错

error: [Errno 32] Broken pipe

但是跳过套件设置并在testcase中连接,效果与预期一样。我不明白为什么会这样?创造出来的物体活了多久?套接字对象的打印报告有效对象,而不是无对象

谢谢


Tags: toselfsenddataserverdefconnectsocket
1条回答
网友
1楼 · 发布于 2024-10-02 18:15:36

测试库的默认作用域是“测试用例”,这意味着库将被销毁并为每个测试用例重新创建。因为您没有指定作用域,所以您的库具有默认作用域。因此,每个测试都会获得库的一个新实例

解决方案是显式声明您希望库在套件的生命周期内而不是在每个测试用例的生命周期内存在,以便所有测试用例共享一个套接字连接

class RSPLibrary(object):
    ROBOT_LIBRARY_SCOPE = 'TEST SUITE'
    def __init__(self):
        print("RSPLibrary initiated")
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ...

这在《robot框架用户指南》中标题为Test library scope的一节中有记录

相关问题 更多 >