Show all projects!

Integration Tests beschleunigen (TRUNCATE TABLE)

In einem Projekt mit Codeception hat sich die Laufzeit mit der Anzahl an neuen Tests stark verlängert.

Eine Analyse mit XDebug und Profiler zeigten, dass die Datenbankzugriffe das Nadelöhr waren.

Xdebug Trace anzeige mit kcachegrind

Bei allen Tests wird in der setUp() Methode die Datenbank mit einigen "TRUNCATE" Tabellen aufrufen geleert.

Datenbanken sind normalerweise nicht für das schnelle "leeren" (truncate) optimiert, sondern,, mit vielen Daten schnell zu arbeiten. In Umfeld eines Integrationstests kann das allerdings sinnvoll sein.

Die Mariadb Doku verweist auf die Einstellung `innodb_file_per_table=OFF` https://mariadb.com/kb/en/inno... um Datenbanken schneller löschen zu können. Bei meinem Setting konnten damit die Tests von 20 auf 6 Minuten beschleunigt werden.


Der Hinweis auf dieses Setting findet sich auch in der Dokumentation https://mariadb.com/kb/en/trun... .


Ich habe mir ein Container extra mit diesem Setting gebaut

Dockerfile

FROM mariadb:10.11.8

COPY mariadb.cnf /etc/mysql/conf.d/my_custom.cnf
RUN chmod 644 /etc/mysql/conf.d/my_custom.cnf

mariadb.cnf

[mysqld]

; could be removed with MariaDB 11
innodb_file_per_table=OFF
innodb_adaptive_hash_index=OFF
docker build -t mariadb-integration .

Und nun nur noch den gepachten Container in der Pipeline oder lokal verwenden. Um diesen in der Pipeline zu verwenden, muss man diesen natürlich erst in die eigene Registry oder docker Hub ablegen.

Article relase date: / Last update: