Рома
И это было не все hr у нее были еще сложнее задачки. А занимаются они разработкой метрик
Рома
Вакансии не выкладывают, сама написала сама достала хаха
Nikolay
я бы считал как 36 возможных вариантов из них 4 нам подходят:)
Рома
public function testCreateSuccess(): void { $executor = $this->databaseTool->loadFixtures([StmtFixture::class]); /* @var Stmt $stmt */ $stmt = $executor->getReferenceRepository()->getReference(StmtFixture::REFERENCE); /* @var Stmt $existingStmt */ $existingStmt = $this->stmtRepository->find($stmt->getId()); $existingStmt->setName('bbbb'); dump($stmt); dump($existingStmt); $this->assertEquals($stmt->getId(), $existingStmt->getId()); }
Рома
подскажите мне кажется мои тесты не работают как хотелось бы не происходит реального обращения к БД и stmt и existingStmt ссылаются на одну область в памяти
Рома
$this->stmtRepository->find($stmt->getId()) не работает тупо ссылка на stmt или это оптимизация в симфони и так должно быть?
Рома
/** * Успешно вернуть заявку. */ public function testFindByIdSuccess(): void { $stmtService = app(StmtService::class); $stmt = Stmt::factory()->create(); $model = $stmtService->findById($stmt->id); $stmt->id = 10; $this->assertSame($model->id, $stmt->id); } если я сделаю тоже в ларе то тест упадет
Рома
как он мне возвращает данные из пустой БД? подскажите где посмотреть это причем всегда такие же . где то создал sqlite
Рома
как настроить дебаг в тестах?
Nikolay
как настроить дебаг в тестах?
Он одинаково настраивается, гайдов полно
Рома
оппа
Рома
и как явно настроить эту магию?
Рома
Рома
when@test: doctrine: dbal: # "TEST_TOKEN" is typically set by ParaTest dbname_suffix: '_test%env(default::TEST_TOKEN)%' mapping_types: enum: string а понял и вообще нашел две статьи https://medium.com/@soufiyane.aitmoulay/setting-up-a-testing-database-in-symfony-54c5ff5a85dd https://joeymasip.medium.com/symfony-phpunit-testing-database-data-322383ed0603
Рома
подскажите как это работает если я привязываю референс данные одинаковые, а так разные как мне извлечь объект этот?
Рома
Рома
$executor->getReferenceRepository()->getReference(StmtFixture::REFERENCE) одинаковые $executor->getReferenceRepository() разные
Рома
нашел! $executor->getReferenceRepository()->getReferencesByClass()
Михаил
Когда ты просишь em найти по id то первым делом он смотрит, была ли загружена подобная энтити раньше, если да - то возвращает ссылку на неё.
Рома
и для чего так сделано? это сложно использовать в тестировании, хорошо, что я нашел метод который возвращает entity, а не proxy
Рома
так смысл проверить, что данные в бд записались, вернуть и проверить их с исходными прогнав через обработку или такое в симфони не тестируют из-за слишком умного em
Павел
и для чего так сделано? это сложно использовать в тестировании, хорошо, что я нашел метод который возвращает entity, а не proxy
Ели речь про референсы в тестировании, то их использовать поидее только в фикстурах, чтобы связать сущности
Рома
понять бы как доработать это $executor = $this->databaseTool->loadFixtures([StmtFixture::class]) чтоб можно было свои параметры задавать, как в laravel Factory
Рома
class StmtFixture extends Fixture { public const REFERENCE = 'stmt'; /** * @throws \ReflectionException */ public function load(ObjectManager $manager, ?array $data = null): void { $stmt = (new StmtFactory())->create($data); $manager->persist($stmt); $manager->flush(); $this->addReference(self::REFERENCE, $stmt); } } метод есть, но вызывается не явно
Рома
или мне вообще фикстуры не нужны можно и так сохранить данные из теста
Рома
да use Liip\TestFixturesBundle\Services\DatabaseToolCollection; use Liip\TestFixturesBundle\Services\DatabaseTools\AbstractDatabaseTool;
Рома
попробую без фикстур кажется они лишние
Рома
да лишние) все и так пишется единственное надо базу как то отчищать
Павел
понять бы как доработать это $executor = $this->databaseTool->loadFixtures([StmtFixture::class]) чтоб можно было свои параметры задавать, как в laravel Factory
Есть способ - создавайте отдельные файлы фикстур под кажджый нужный кейс. Плюс он будет именованным
Павел
Т.е. не UserFixture и тут куча фикстур, а AdminUserFixture, BannedUserFixture
Рома
зачем фиктуры это аналог seed для предварительного заполнения базы
Павел
зачем фиктуры это аналог seed для предварительного заполнения базы
Затем, чтобы не делать кучу фейк фикстур, а конкретные с конкретными данными. Порой это полезно.
Павел
Например можете прописать id у фикстуры конкретный и в тестах проверять этот id
Рома
а можно в фабрику прокинуть id в тесте
Павел
Фейковые фикстуры хороши тем, что они могут какой то кейс вскрыть. Но плохи и тем же, что не понятно что в бд и что мы проверяем
Павел
Ели речь про референсы в тестировании, то их использовать поидее только в фикстурах, чтобы связать сущности
Тут я возможно ошибся, так как в liip есть свои фишки, и там судя по всему свои референсы отдельные еше есть
Рома
https://maks-rafalko.github.io/blog/2021-11-21/symfony-tests-performance/ решение Use dama/doctrine-test-bundle to rollback transaction after each test
Павел
Павел
https://maks-rafalko.github.io/blog/2021-11-21/symfony-tests-performance/ решение Use dama/doctrine-test-bundle to rollback transaction after each test
https://symfony.com/doc/current/testing.html#resetting-the-database-automatically-before-each-test В самой доке симфы
Рома
а у меня его нет
Михаил
Зачем бандлы? В родительском setUp начинаешь транзакцию в тирдаун откатываешь
Рома
хотя бы сделали сборщик какой полезных библиотек при создании проекта
Рома
как есть у многих
Павел
Но соглашусь что дока не юзерфрендли для начинающих
Рома
да я прочитаю доку, когда появится время и понимание основ
Павел
да я прочитаю доку, когда появится время и понимание основ
У вас инвертированный подход какой то)))
Рома
ну читать список методов не понимая зачем и как они связаны у меня не получается
Павел
Обычно читают инструкцию к болгарке, прежде чем пилят пальцы и решают все же почитать )))
Рома
только не работает это)
Павел
только не работает это)
Что не работает?
Рома
не чистит базу
Павел
не чистит базу
Значит настроили неверно
Павел
Там не просто установить бандл
Рома
<extensions> <extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension" /> </extensions> это автоматом добавилось в доке написано, что просто)
Павел
не чистит базу
Он кстати не должен чистить базу, он должен приводить ее в состояние до теста
Рома
да, но не приводит
Павел
Почистите кэш, хз. Так то рабочая тема да и без сложностей вроде ставилась, да экстеншенем
Павел
Возможно у вас не подхватывает нужный phpunit конфиг, но на это как уже писал - прежде всего запускайте из консоли
Рома
а вижу
Рома
Рома
вот зачем так часто меняют
Павел
а вижу
Дока наше всё)
Рома
отлично всё работает)
Рома
да симфони это новый уровень) как с# пересесть на с++
Рома
private EntityManager $entityManager; private StmtRepository $stmtRepository; private StmtService $stmtService; protected function setUp(): void { parent::setUp(); $kernel = self::bootKernel(); $this->entityManager = $kernel->getContainer()->get('doctrine')->getManager(); $this->stmtRepository = static::getContainer()->get(StmtRepository::class); $this->stmtService = static::getContainer()->get(StmtService::class); } /** * Успешное создание заявки. * * @throws \ReflectionException * @throws ORMException */ public function testCreateSuccess(): void { $stmt = (new StmtFactory())->create(); $this->entityManager->persist($stmt); $this->entityManager->flush(); $existingStmt = $this->stmtRepository->findOneBy(['id' => $stmt->getId()]); $this->assertSame($stmt->getId(), $existingStmt->getId()); } наконец-то) начало положено)
Рома
на собесе спросили про оптимизацию поле a 100 уникальных значений поле б 10 уникальных значений с 1000 уникальных значений три выборки а.б.с как их сделать максимально быстрыми сделать ключ б и составной с,б,а где подробнее узнать об этом?
Рома
неужели бэку нужно быть ещё и оптимизатором баз данных забыл как эта вакансия называется
Павел
неужели бэку нужно быть ещё и оптимизатором баз данных забыл как эта вакансия называется
dba. Потому то обычно нет отдельного dba. А если есть сисадмин который следит за инфрой, то он не обязат быть dba
Рома
вот именно DBA блт
Рома
х-пхах ну да экономия
Павел
Ну не каждый бизнес гребет миллионы и имеет комманду в десятки и сотни человек
Рома
особенно всеросийские конторы
Владимир
Ну не каждый бизнес гребет миллионы и имеет комманду в десятки и сотни человек
Не ломайте молодому человеку розовые очки, пожалуйста, Павел