Testimisstrateegia
merql kasutab teadaoleva tulemiga juhitud testimismudelit. Iga testimisstsenaarium määrab kindla sisendite komplekti (kolm andmebaasi olekut), deterministliku oodatava tulemuse (etalonväärtuse) ja võrdleb tegelikku ühendamist selle ootusega. 32 stsenaariumi katavad puhtad ühendamised, konfliktid, identiteedi lahendamise, andmetüübid, mahu ja erandjuhud.
# Run the full verification suite.
./bin/verify-all
Selle lehe käsud käivitatakse merql-hoidla väljavõttest pärast
composer install. Arendusskriptid asukohas bin/, korpus scenarios/
ja testid ei kuulu paketti Composer. Arendussõltuvuste hulka kuulub PHPUnit 13, mis vajab versiooni PHP 8.4 või uuemat, kuigi teek ise töötab versiooniga PHP 8.2.
Tulemuspõhine testimine
Olemas pole võrdlustööriista, mis teeks andmebaasi kolmepoolset ühendamist, seega arvutatakse etalon teadaolevate sisendite põhjal, mitte välise tööriista abil. Igal stsenaariumil on deterministlik oodatav tulemus, mida saab loogika põhjal kontrollida:
- Seadistus -- loo kolm teadaoleva sisuga andmebaasi olekut (alus, meie oma, nende oma).
- Etalon -- arvuta teadaolevate sisendite põhjal oodatav ühendamistulemus.
- Tegelik tulemus -- käivita merqli ühendamine kolme olekuga.
- Võrdlus -- tegelik tulemus peab täpselt vastama oodatud tulemusele.
Known inputs (base, ours, theirs)
| |
Deterministic merql merge
computation
| |
Expected result Actual result
| |
-----> Compare <-----
|
Pass or Fail
Testide käivitamine
Täielik kontrollimine
Skript verify-all on viimane kontrollvärav. See käivitab staatilise analüüsi, koodistandardite kontrolli, PHPUnit testid ja etalonväärtustel põhineva regressioonitestide komplekti:
./bin/verify-all
See peab läbima enne, kui tööd saab lõpetatuks pidada.
Etalonväärtustel põhinev regressioonitestide komplekt
Käivita kõik 32 stsenaariumi:
./bin/test-regression
Käivita üks kategooria:
./bin/test-regression --category clean
./bin/test-regression --category conflict
./bin/test-regression --category identity
Kategooriad on kataloogide nimed asukohas scenarios/: clean, conflict,
identity, types, scale ja edge. Tundmatu kategooria korral kuvatakse No scenarios found ja väljutakse edukalt. Mitme kategooria käivitamiseks võib --category korrata.
Skript aktsepteerib ka väärtust --jobs, kuid eirab seda ja käivitab stsenaariumid
üksteise järel (#5).
Käivita minimaalse väljundiga (ainult läbitud/ebaõnnestunud):
./bin/test-regression --fast
Üksik stsenaarium
Testi üht stsenaariumi kogu töövooga:
./bin/test-scenario column-level-clean
Üksikud etalonarvutuse etapid
./bin/oracle column-level-clean # Compute expected result
./bin/actual column-level-clean # Run merql, capture output
./bin/compare column-level-clean # Diff oracle vs actual
Ühiktestid
composer test:unit # Isolated component tests
composer test:integration # Integration tests (SQLite, plus MySQL when configured)
composer test # All PHPUnit suites
composer test:oracle # Oracle regression corpus (bin/test-regression)
composer verify # analyse + cs + test + test:oracle
composer test käivitab ainult PHPUnit. oracle PHPUnit komplekt osutab asukohale
tests/Oracle, mis sisaldab stsenaariumide käivitaja klasse, kuid mitte testjuhtumeid. Seega käivitatakse 32 stsenaariumi ainult käsuga composer test:oracle, composer verify või
./bin/verify-all.
MySQL integratsioonitestid jäetakse vahele, kui MERQL_MYSQL_HOST, MERQL_MYSQL_DATABASE ja MERQL_MYSQL_USER (ning soovi korral MERQL_MYSQL_PASSWORD ja MERQL_MYSQL_PORT) ei osuta testandmebaasile.
Koodi kvaliteet
composer cs # PSR-12 coding standards check
composer cs:fix # Auto-fix coding standards
composer analyse # PHPStan level 10 static analysis
Stsenaariumide kategooriad
clean (8 stsenaariumi)
Puhtad ühendamised ilma konfliktideta. Mõlemad pooled võivad andmeid muuta, kuid mitte kunagi sama rea sama veergu.
| Stsenaarium | Testitav |
|---|---|
insert-only-theirs |
Nende poolt lisatud read, meie pool muutmata. |
update-only-theirs |
Nende poolt uuendatud read, meie pool muutmata. |
delete-only-theirs |
Nende poolt kustutatud read, meie pool muutmata. |
insert-only-ours |
Meie poolt lisatud read, nende pool muutmata. |
mixed-no-overlap |
Mõlemad muutsid eri tabeleid või ridu. |
both-same-change |
Mõlemad tegid samad muudatused (konflikti pole). |
column-level-clean |
Mõlemad muutsid sama rea eri veerge. |
multi-table |
Muudatused mitmes tabelis. |
conflict (6 stsenaariumi)
Stsenaariumid, mille tulemuseks peavad olema konfliktid.
| Stsenaarium | Testitav |
|---|---|
both-update-same-column |
Mõlemad muutsid sama veeru eri väärtuseks. |
update-vs-delete |
Üks pool uuendas ja teine kustutas sama rea. |
delete-vs-update |
Uuendamise ja kustutamise vastupidine suund. |
both-insert-same-pk |
Mõlemad lisasid sama primaarvõtmega rea. |
multiple-conflicts |
Ühes ühendamises mitu konflikti. |
partial-conflict |
Mõnes veerus on konflikt, teised ühinevad tõrgeteta. |
identity (4 stsenaariumi)
Rea identiteedi erijuhud.
| Stsenaarium | Testitav |
|---|---|
auto-increment |
Uute ridade ID-d on harudes erinevad. |
natural-key |
Sobitamine kordumatute veergude, mitte PK järgi. |
composite-key |
Mitmeveeruline primaarvõti. |
no-key |
Primaarvõtmeta tabel (sisu räsi varuvariandina). |
types (6 stsenaariumi)
Kõigi veerutüüpide andmetüüpide käsitlemine.
| Stsenaarium | Testitav |
|---|---|
text-columns |
VARCHAR-, TEXT- ja LONGTEXT-väärtused. |
numeric-columns |
INT-, DECIMAL- ja FLOAT-väärtused. |
date-columns |
DATE-, DATETIME- ja TIMESTAMP-väärtused. |
json-columns |
JSON veeru ühendamine. |
blob-columns |
Binaarandmed. |
null-handling |
Üleminek NULL-ist väärtuseks ja väärtusest NULL-iks. |
scale (4 stsenaariumi)
Jõudlus koormuse all.
| Stsenaarium | Testitav |
|---|---|
1k-rows |
1,000 rida. |
10k-rows |
10,000 rida. |
100k-rows |
100,000 rida. |
wide-table |
Tabel 50+ veeruga. |
edge (4 stsenaariumi)
Erandjuhud ja piiritingimused.
| Stsenaarium | Testitav |
|---|---|
empty-changeset |
Ühel või mõlemal poolel muudatusi pole. |
schema-mismatch |
Hetktõmmiste vahele lisati või eemaldati veerg. |
encoding |
UTF-8, emotikonid ja erimärgid. |
large-text |
Väga suured TEXT-/LONGTEXT-väärtused. |
Stsenaariumi ülesehitus
Iga stsenaarium on kataloog asukohas scenarios/<category>/<name>/ ja sisaldab scenario.json konfiguratsiooni:
{
"name": "column-level-clean",
"category": "clean",
"description": "Both sides modify same row but different columns",
"tables": ["test_posts"],
"expectations": {
"conflicts": 0,
"operations": 3,
"changeset_match": "exact",
"merge_match": "exact",
"sql_match": "semantic"
}
}
Konfliktistsenaariumide puhul määratakse oodatavad konfliktid üksikasjalikult:
{
"expectations": {
"conflicts": 1,
"conflict_details": [
{
"table": "test_posts",
"primary_key": {"id": 42},
"column": "title",
"ours_value": "Welcome",
"theirs_value": "Greetings"
}
]
}
}
ScenarioRunneri töövoog
ScenarioRunner::run() korraldab ühe stsenaariumi täitmise:
OracleCapture::compute()loob stsenaariumi JSON andmetest kolm hetktõmmist ja käivitab ühendamise.ScenarioComparator::compare()võrdleb ühendamistulemust asukohasscenario.jsonolevate oodatud väärtustega.- Tagastab läbitud/ebaõnnestunud tulemuse koos tõrketeadete loendiga.
use Merql\Tests\Oracle\ScenarioRunner;
$result = ScenarioRunner::run($scenario);
// ['name' => 'column-level-clean', 'pass' => true, 'failures' => []]
ScenarioRunner::runAll() käivitab järjest kõik stsenaariumid:
$results = ScenarioRunner::runAll($scenarios);
Uue stsenaariumi lisamine
- Loo kataloog:
scenarios/<category>/<name>/. - Loo
scenario.jsonstsenaariumi metaandmete ja ootustega. - Määra konfiguratsioonis JSON kolm andmebaasi olekut: algandmed, meie muudatused ja nende muudatused.
- Käivita stsenaarium:
./bin/test-scenario <name>. - Kontrolli kogu testikomplekti:
./bin/verify-all.
Koodi kvaliteedistandardid
merql jõustab järgmised nõuded:
- PHPStan tase 10 -- range staatiline analüüs ilma lähtetaseme eranditeta.
- PSR-12 -- kodeerimisstandardeid kontrollib
phpcs. - Oracle'i regressioonitestid -- kõik 32 stsenaariumi peavad läbima.
- Ühiktestid -- iga komponendi eraldiseisvad testid.
verify-all skript käivitab kõik neli kontrolli järjest. Osalist heakskiitu ei aktsepteerita.
Pidev integratsioon
CI käivitab kodeerimisstandardite kontrolli, PHPStan, composer test, integratsioonitestid versiooniga MySQL 8.4 mysqli kaudu, ühendamisprimitiivide katvuse ja composer audit iga main-i harusse tehtud tõuke ja iga pull request'i korral. Oracle'i regressioonitestide korpust (#6) ei käivitata, seega käivita enne muudatusele toetumist kohapeal composer test:oracle või ./bin/verify-all.