Symfony 5를 사용한 AB 테스트가 쉬워졌습니다.

8779 단어 phpabtestsymfony
내가 일하는 회사는 데이터 기반 회사입니다. 우리는 최선의 결정을 내리고 우리의 핵심 가치인 고객 중심을 목표로 삼아야 합니다.

당연히 기능을 반복할 때 데이터를 연구하여 개선 방법을 정의합니다. 그리고 측정하지 않는 것은 개선할 수 없기 때문에 새 버전의 결과를 이전 버전과 함께 측정합니다.

이를 위해 우리는 이벤트 데이터베이스와 결합하는 AB 테스트를 거의 체계적으로 수행합니다.

AB tests are not for experimenting things, but to measure them.



그리고 HacktoberFest 이므로 오픈 소스로 도구 중 하나를 여기에 게시했습니다. Travaux.com VariantRetriever

이 기사의 다음 부분은 새 사용자가 등록할 때 이메일 제목을 변경하는 것과 같은 첫 번째 AB 테스트를 시작하는 것입니다.
우리가 하고 있는 실험은 welcome-email-experiment라고 하며 control 버전(실제 버전)과 participant(또는 변형) 버전(우리가 시도하려는 새 버전)이 있습니다.

이 이메일을 보낼 때 VariantRetriever가 필요하고 요청할 것입니다. 이 실험과 이 사용자 식별자에 대해 어떤 변형이 있어야 하는지 알려주세요.

Symfony 5로 새로운 AB 테스트 실행



첫 번째 단계는 물론 프로젝트에 AB 테스트 패키지를 설치하는 것입니다.
composer require travaux-com/variantretriever
Symfony 번들이 아니기 때문에 AppKernel 파일에 선언할 필요는 없지만 서비스로 선언하기 위해서는 여전히 필요합니다(사실상 권장됨).

실행 중인 AB 테스트에 대한 모든 정보가 포함된 "변형 검색기"를 갖기 위해 Symfony 컨테이너 팩토리 시스템에서 서비스로 선언할 것입니다. (welcome-email-experimentdisplay-cta ).

services:
    App\FeatureFlag\VariantRetriever:
        factory:   ['@Travaux\VariantRetriever\Factory\VariantRetrieverFactory', 'createVariantRetriever']
        public: true
        arguments:
            - welcome-email-experiment:
                - control-email: 50
                - participant-email: 50
            - display-cta:
                - control-cta: 75
                - participant-cta: 25

서비스 이름은 실제로 App\FeatureFlag\VariantRetriever이지만 사용자 정의하는 것이 좋습니다.

이제 Symfony autowiring을 사용하여 VariantRetrieverInterface를 검색하고 명령 처리기에서 사용할 수 있습니다.
등등, 그것을 사용하는 방법?

$affectedVariant = $variantRetriever
           ->getVariantForExperiment(
                  new Experiment('my-ab-test'), 
                  (string) $user->getId()
           );
VariantRetrieverInterface 실제로 테스트하려는 실험을 정의해야 하는 getVariantForExperiment 메서드와(실험 이름을 채우는 것만으로) 문자열만 필요한 "사용자 식별자"를 정의해야 하므로 UUID v4가 될 ​​수 있습니다. 또는 자동 증가 정수.

영향을 받는 변형의 이름이 포함된 Variant 값 개체를 반환합니다.

이제 이메일의 영향을 받는 변형에 따라 사용할 올바른 번역 키를 선택하는 것을 상상할 수 있습니다.

$experimentTranslationsKeys = [
       'control' => 'email.welcome.subject_control',
       'variant' => 'email.welcome.subject_variant',
];
$userVariant = $variantRetriever
           ->getVariantForExperiment(
                  new Experiment('welcome-email-experiment'), 
                  (string) $user->getId()
           );
$emailSubject = $experimentTranslationsKeys[(string) $userVariant];

이 패키지를 사용하면 데이터베이스나 캐시 없이 사용자에 대해 항상 동일한 변형을 검색할 수 있습니다.

이제 Symfony 프로젝트에서 첫 번째 AB를 실행할 수 있습니다 🎉

이 예를 넘어



보시다시피 Symfony container factory 시스템을 사용하여 VariantRetriever를 인스턴스화했지만 다음과 같이 Symfony method call으로 선언할 수도 있습니다.

   Travaux\VariantRetriever\Retriever\VariantRetrieverInterface:
        class: Travaux\VariantRetriever\Retriever\VariantRetriever
        calls:
            - addExperiment:
                - !service
                    class: Travaux\VariantRetriever\ValueObject\Experiment
                    arguments:
                        - 'welcome-email-experiment'
                        - !service
                            class: Travaux\VariantRetriever\ValueObject\Variant
                            arguments: ['control', 100]
                        - !service
                            class: Travaux\VariantRetriever\ValueObject\Variant
                            arguments: ['variant', 0]

내부적으로 어떻게 작동합니까?



php crc32 함수 덕분에 매번 같은 정수 값을 반환하는 문자열을 처리할 수 있습니다. 따라서 숫자가 크더라도 변형 중 하나에서 제공하는 롤아웃 비율과 일치하는 0에서 99 사이의 범위로 줄일 수 있습니다.

또한 Travaux\VariantRetriever\Retriever\VariantRetriever 클래스는 확장할 수 있는 최종 클래스가 아닙니다. 어떤 실험이 어떤 사용자에게 영향을 미쳤는지 추적하기 위해 PsrLogger 및/또는 이벤트 디스패처를 주입하는 것과 같습니다. 다음과 같이 사용자 엔터티 개체를 기반으로 변형을 검색하는 고유한 메서드를 추가할 수도 있습니다.

public function getUserVariantForExperiment(
    Experiment $experiment,
    User $user
);

자유롭게 이 프로젝트에 기여하거나 피드백을 제공하십시오.

좋은 웹페이지 즐겨찾기