模拟长时间网络请求以进行Python测试

时间:2020-04-26 19:51:11

标签: python testing server

我需要测试设备更新功能。该函数在主机上打开套接字并发送文本块。

更新最多可能需要120秒。它返回成功/失败的代码。为了允许程序继续运行,更新是在线程中启动的。

我无法控制设备的响应。该模拟必须能够保持打开的连接至少120秒。

它不必是安全的或可伸缩的,因为它仅用于集成测试。最简单的解决方案是首选。纯python是最好的,但是docker也可以接受。

1 个答案:

答案 0 :(得分:0)

我是根据rdas的指针写的。

import json
import logging
import socket
import socketserver
import threading
import time

log = logging.getLogger(__name__)
log.setLevel(logging.INFO)

class LongRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        # Echo the back to the client
        data = json.loads(self.request.recv(1024).decode())
        t = 0
        while t < data['delay']:
            time.sleep(1)
            print(".", end='')
            t += 1
            if t % 80 == 0:
                print("\n")
        print("\n")
        self.request.send(b"ok")

class Server():

    def __init__(self, host='localhost', port=0):
        self.host = host
        self.port = port
        self.ip = None
        self.server = None

    def run(self):
        address = (self.host, self.port)  # let the kernel assign port if port=0
        self.server = socketserver.TCPServer(address, LongRequestHandler)
        self.ip, self.port = self.server.server_address  # what port was assigned?

        t = threading.Thread(target=self.server.serve_forever)
        t.setDaemon(True)  # don't hang on exit
        t.start()
        return True

    def send_request(self, data: dict ):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((self.ip, self.port))
        message = json.dumps(data).encode()
        s.send(message)
        response = s.recv(1024)
        s.close()
        return response

    def __exit__(self):
        self.server.shutdown()
        self.server.socket.close()



if __name__ == '__main__':
    # For simple testing and config example...
    server = Server()
    server.run()
    # Send the data
    d = dict(delay=5)  # set delay here to desired
    out = server.send_request(d)
    print('Received: {!r}'.format(out))