Рома
И это было не все 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
Павел
Рома
понять бы как доработать это
$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;
Павел
Рома
попробую без фикстур кажется они лишние
Рома
да лишние)
все и так пишется единственное надо базу как то отчищать
Павел
Павел
Т.е. не UserFixture и тут куча фикстур, а AdminUserFixture, BannedUserFixture
Рома
зачем фиктуры это аналог seed для предварительного заполнения базы
Павел
Например можете прописать id у фикстуры конкретный и в тестах проверять этот id
Рома
а можно в фабрику прокинуть id в тесте
Павел
Фейковые фикстуры хороши тем, что они могут какой то кейс вскрыть. Но плохи и тем же, что не понятно что в бд и что мы проверяем
Рома
https://maks-rafalko.github.io/blog/2021-11-21/symfony-tests-performance/
решение
Use dama/doctrine-test-bundle to rollback transaction after 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 блт
Рома
х-пхах ну да экономия
Павел
Ну не каждый бизнес гребет миллионы и имеет комманду в десятки и сотни человек
Рома
особенно всеросийские конторы
Владимир