Cicada 분산 테스트 프레임워크 작성

작년에 나는 Cicada-2, a low-code testing framework를 썼다.발표된 이래로, 나는 특히 부하 테스트를 실행할 때 그것을 개선하는 방법을 고려해 왔다.이것은 내가 어떻게 만들었는지 Cicada Distributed, a Python based load testing framework 의 이야기이며, 왜 나는 그것이 당신의 서비스를 테스트하는 도구가 되어야 한다고 생각하는지.

왜 다시 쓸 때가 됐어


Cicada-2는 복잡한 어플리케이션을 테스트하면서 배운 경험을 바탕으로 합니다.비록 통합 테스트에 매우 적합하지만, 내가 유효 부하 테스트를 작성하는 데 필요한 기능은 없다.Cicada-2의 하드코딩 부하 모델은 '여러 번 나를 명중시키는 API' 를 초과하는 테스트를 작성할 때 한계가 있습니다. 서비스에 충분한 명중을 해서 그 한계가 무엇인지 알 수 있는 도구를 원합니다.
이 점을 감안하여, 나는 Cicada-2에 더 많은 프로그래밍 테스트 기능을 추가하기 시작했다.그러나, 나는 차라리 파이톤으로 테스트를 작성할 수 있을지언정, 서투른 귀속 YAML과 Jinja2를 혼합하고 싶지 않다는 것을 곧 깨달았다.그래서 나는 다시 매미를 쓰기 시작했다.

매미를 되새기다


새로운 Cicada의 핵심 기능은 테스트를 완전히 제어할 수 있는 부하 모델이었으면 합니다.하나의 테스트는 서비스의 일정 횟수를 호출할 수 있을 뿐만 아니라, 점차적으로 증가하는 부하, 한도값으로 확장, 그리고 내가 고려하지 않았던 다른 상황도 제공할 수 있어야 한다.
이를 위해 Cicada는 가상 사용자 모델을 사용했습니다.본질적으로 사용자 조작을 모의하는 코드는 부하를 만들기 위해 병행 운행된다.라인 내부에서 가상 사용자를 실행할 수 있도록 이 초기 버전을 작성했습니다.불행히도 이것은 결코 좋은 방법이 아니다.인쇄 문장은 테스트의 나머지 부분을 파괴할 것이다.나는 이상한 벌레를 발견할 것이다. 어떤 것이 소금에 절여도 되고, 안 절여도 되는지에 관한 것이다.테스트 외에 작성된 코드는 항상 유효하지 않다.이 밖에 사용자 라인을 관리하는 과정이 병목이 되었다.성능에 큰 영향을 미치지 않는 상황에서 어떤 사용자가 시작하고 멈출 수 있는지 제어하기 어렵다.

새 매미의 작업 원리


몇 차례의 수정을 거친 후에 나는 분포식 사용자 모델을 확정했다. 이 모델은 이벤트 에이전트와 장면의 해이한 결합(현재는 Kafka)을 통해 이루어진다.가상 사용자는 관리 실례에서 실행되지 않고 용기에서 실행됩니다.이는 Cicada가 사용자 풀을 관리할 때 용기 배열기를 사용하도록 허용하기 때문에 가상 사용자 코드를 크게 간소화시켰다.또한 이벤트 모델은 사용자가 자신의 속도로 명령을 받고 결과를 반송할 수 있도록 하기 때문에 테스트에 성능 병목이 생기기 쉽지 않다.

또 다른 주요 개선 사항은Cicada Distributed의 부하 모델이Cicada-2의 부하 모델보다 더 설정할 수 있다는 것입니다. 일반적인 Python으로 작성하고 API를 통해 장면을 제어할 수 있도록 합니다.이것은 프로그래밍 방식을 통해 사용자를 위아래로 확장하고, 사용자 탱크에 부하를 분배할 수 있음을 의미한다.마지막으로 사용자가 정의한 집합과 오류 필터 기능을 통해 결과를 수집하고 분석하는 방법을 완전히 제어할 수 있습니다.

간단한 예


Cicada Distributed의 향상된 로드 테스트 기능을 시연하기 위해 간단한 테스트 예제를 통해 시연합니다.이 예에서는 사용자를 만들고 데이터베이스에 저장하기 위한 엔드포인트an API를 만들었습니다.

기본적인 부하 테스트에 대해 우리는 일정 시간 내에 유한한 사용자 수로 이 단점에 도달할 수 있다.먼저 Docker 및 Cicada Distributed를 설치하고 빈 항목을 만들어야 합니다.
pip install cicadad

mkdir load-test
cd load-test

cicada-distributed init .
로드 테스트 디렉토리에는 다음과 같은 여러 파일이 표시됩니다.
  • Dockerfile
  • 테스트.py
  • Cicada는 Docker 패키지 테스트를 사용하기 때문에 사용자나 장면에서 사용할 수 있도록 이미지에 의존 항목을 추가할 수 있습니다.Dockerfile에 요청 패키지 추가하기
    FROM cicadatesting/cicada-distributed-base-image:latest
    
    RUN pip install requests
    
    COPY . .
    
    ENTRYPOINT ["python", "-u", "test.py"]
    
    다음은 테스트를 업데이트합니다.기본 로드 테스트를 수행하는 경우:
    ...
    from cicadad.core.decorators import scenario, load_model, user_loop
    from cicadad.core.scenario import n_seconds, iterations_per_second_limited
    ...
    
    @scenario(engine)
    @load_model(n_seconds(180, 30))
    @user_loop(iterations_per_second_limited(4))
    def post_user(context):
        requests.post(
            url="http://172.17.0.1:8080/users",
            json={
                "name": "jeremy",
                "age": 23,
                "email": f"{str(uuid.uuid4())[:8]}@gmail.com",
            },
        )
    
    이 예에서 Cicada는 180초 동안 30명의 사용자를 포함하는 사용자를 만들기 위해post 사용자 테스트를 수행합니다.이 밖에 사용자당 초당 최대 4개의 요청만 있을 수 있다.테스트를 수행하려면 클러스터(이벤트 에이전트와 컨테이너를 만드는 서비스)를 시작하고 테스트를 실행해야 합니다.
    cicada-distributed start-cluster
    cicada-distributed run
    
    런타임 시 다음과 같은 로드 커브가 제공됩니다(Prometheus+Grafana를 사용하여 API를 모니터링합니다).

    API가 3분 안에 얼마나 많은 부하를 견딜 수 있는지 보고 싶다면?행@user_loop(iterations_per_second_limited(4))을 제거하고 행@user_loop(while_alive())으로 대체합니다(cicadd.core.scenario import while alive에서 가져오기).이것은 가상 사용자가 가능한 한 많은 요청을 할 수 있도록 초당 요청의 제한을 없앨 것이다.내 컴퓨터에서 나는 초당 약 200개의 요청을 처리할 수 있다. (비록 Cicada의 가상 사용자는 기능이 더 강한 호스트에 더 높은 RPS를 보낼 수 있지만.)시스템에서 얼마나 많은 부하를 처리할 수 있는지 평론에 알려 주십시오.

    결론


    어쨌든 저는 Cicada Distributed가 Cicada-2의 유연성보다 더 만족스럽습니다.언제든지 try Cicada Distributed out에 연락해서 당신의 생각을 저에게 알려주세요!

    좋은 웹페이지 즐겨찾기