성능 테스트 - Locust TCP socket client (전송)

4672 단어 Locust
배경
Locust 는 성능 테스트 도구 이지 만 기본적으로 http 프로 토 콜 만 지원 합 니 다. http 만 지원 하 는 client 입 니 다. 다른 프로 토 콜 이 필요 한 테스트 는 아래 TCP client 와 같은 클 라 이언 트 를 확장 해 야 합 니 다.
2 차 개발
1. Tcp 소켓 client 클래스
import time
import random
# from socket import socket, AF_INET, SOCK_STREAM
import socket
from locust import Locust, TaskSet, events, task
 
# author: Max.Bai
# date: 2017-04
 
class TcpSocketClient(socket.socket):
    # locust tcp client
    # author: Max.Bai@2017
    def __init__(self, af_inet, socket_type):
        super(TcpSocketClient, self).__init__(af_inet, socket_type)
 
    def connect(self, addr):
        start_time = time.time()
        try:
            super(TcpSocketClient, self).connect(addr)
        except Exception as e:
            total_time = int((time.time() - start_time) * 1000)
            events.request_failure.fire(request_type="tcpsocket", name="connect", response_time=total_time, exception=e)
        else:
            total_time = int((time.time() - start_time) * 1000)
            events.request_success.fire(request_type="tcpsocket", name="connect", response_time=total_time, response_length=0)
        
    def send(self, msg):
        start_time = time.time()
        try:
            super(TcpSocketClient, self).send(msg)
        except Exception as e:
            total_time = int((time.time() - start_time) * 1000)
            events.request_failure.fire(request_type="tcpsocket", name="send", response_time=total_time, exception=e)
        else:
            total_time = int((time.time() - start_time) * 1000)
            events.request_success.fire(request_type="tcpsocket", name="send", response_time=total_time, response_length=0)
 
    def recv(self, bufsize):
        recv_data = ''
        start_time = time.time()
        try:
            recv_data = super(TcpSocketClient, self).recv(bufsize)
        except Exception as e:
            total_time = int((time.time() - start_time) * 1000)
            events.request_failure.fire(request_type="tcpsocket", name="recv", response_time=total_time, exception=e)
        else:
            total_time = int((time.time() - start_time) * 1000)
            events.request_success.fire(request_type="tcpsocket", name="recv", response_time=total_time, response_length=0)
        return recv_data

2. Locust 클래스
class TcpSocketLocust(Locust):
    """
    This is the abstract Locust class which should be subclassed. It provides an TCP socket client
    that can be used to make TCP socket requests that will be tracked in Locust's statistics.
    author: Max.bai@2017
    """
    def __init__(self, *args, **kwargs):
        super(TcpSocketLocust, self).__init__(*args, **kwargs)
        self.client = TcpSocketClient(socket.AF_INET, socket.SOCK_STREAM)
        ADDR = (self.host, self.port)
        self.client.connect(ADDR)

3. Locust - tcp 응용
1. Locust 실행 응용
class TcpTestUser(TcpSocketLocust):
    
    host = "127.0.0.1"
    port = 12345
    min_wait = 100
    max_wait = 1000
 
    class task_set(TaskSet):        
        @task
        def send_data(self):
            self.client.send(random_str())
            data = self.client.recv(2048).decode()
            print(data)
 
 
if __name__ == "__main__":
    user = TcpTestUser()
    user.run()

2, Tcp server 편리 한 테스트 사용
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
 
import time
from socket import socket, AF_INET, SOCK_STREAM
import threading
 
buffsize = 2048
 
def tcplink(sock, addr):
    # print 'Accept new connection from %s:%s...' % addr
    sock.send('Welcome!')
    while True:
        try:
            # data = sock.recv(buffsize)
            data = sock.recv(buffsize).decode()
            time.sleep(1)
            if data == 'exit' or not data:
                break
            sock.send('Hello, %s!' % data)
        except Exception as e:
            print(str(e))
            break
    sock.close()
    print 'Connection from %s:%s closed.' % addr
 
def main():
    host = ''
    port = 12345
 
    ADDR = (host,port)
 
    tctime = socket(AF_INET,SOCK_STREAM)
    tctime.bind(ADDR)
    tctime.listen(3)
 
    print('Wait for connection ...')
    while True:
        sock,addr = tctime.accept()
        print 'Accept new connection from %s:%s...' % addr
 
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()
 
if __name__=="__main__":
    main()

좋은 웹페이지 즐겨찾기