Проверено на php 5.4.45
- Скачать архив https://github.com/errogaht/pabtest2/archive/master.zip
- Все изменения которые я сделал для внедрения системы в исходный код видны тут https://github.com/errogaht/pabtest2/commit/ad87e08f70b2dc66b2187a8c57554fe783f0c0f3
- настраиваем БД для формы регистрации в файле lib/db.php и создаём базу из reg.sql
этот пункт не обязательный, просто если не хочется вручную форму заполнять для тестирования.
acceptance тест, заходит на страницу, заполняет форму и отправляет её, можно запустить много раз подряд
Настраиваем codeception в pabtest2/tests/acceptance.suite.yml , нужно заменить http://pabtest2.loc на ДОМЕН на котором запускается форма Только обратите внимание что тут должен быть именно домен а не домен + path, если нужно отредактировать path то он в самом сценарии теста тут pabtest2/tests/acceptance/EmulateCept.php:4
с текущими настройками тест ломится на http://pabtest2.loc/reg.php
cd pabtest2
chmod a+x runSimulation.sh
runSimulation.sh
x 10
cd pabtest2
php bin/pabtest list
php bin/pabtest result formTest
Сначала я хотел сделать на cookies, подумал что так будет лучше? так как я могу устанавливать cookie lifetime, а при использовании сессии, session life time будет таким, какой он установлен для нужд приложения, в котором запускается тест.
Но с cookies вариант я отбросил так как их нужно устанавливать до заголовков, а в них должна быть информаци какой тест и какой вариант выбран для посетителя ,а чтобы это всё в cookies установить - нужно код инициализации теста вызывать до заголовков. А это не удобно так как код инициализации теста с настройками вариантов удобно располагать не в одном месте, а в месте непосредственного тестирования. Тем более если у нас 20 тестов то информация о тестах будет очень длинная и кука будет большая, а на неё есть ограничения в 4 кб. И тем более нужно шифровать данные в куке. А держать свою базу всех пользователей на стороне сервера это затратно может быть, если у проекта большой траффик, база быстро вырастет до больших размеров, а зачем если можно хранить данные просто в сесиии.
С сессией есть минусы конечно, например session life time установлен ниже чем хотелось бы для АБ тестов, ведь когда посетителю показали вариант A то ему нужно теперь всегда показывать вариант A.
Так как супер точного распределения траффика между вариантами не нужно, а экономия ресурсов гораздо важнее, то я сделал выбор варианта
простым управляемым рандомом с помощью weights, для каждого варианта указывается его вес $formTest = new PABTest2('formTest', ['1' => 50, '2' => 50]);
например если оба веса равны, 1/1 50/50 100/100 то на каждый вариант уйдёт примерно 50% траффика. Чтобы на A ушло 33% а всё остальное на B: ['1' => 1, '2' => 2]
$formTest = new PABTest2('formTest', ['1' => 50, '2' => 50]);
Это мы создали тест с названием formTest
и двумя вариантами:
- 1 на который уйдёт 50% траффика
- 2 на который уйдёт 50% траффика
При вызове в нужном месте $formTest->getVariant()
выдаст либо 1
либо 2
.
Конечно можно и больше вариантов, например так $formTest = new PABTest2('formTest', ['big' => 1, 'medium' => 1, 'small' => 1]);
Когда совершилось целевое действие нам нужно вызвать PABTest2::reachGoal('formTest')
для регистрации конверсии по данному тесту.
Тестов может быть сколько угодно.