рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреНрдд, рд╡рд░реАрдпрддрд╛ рдХреЗ рдмрд┐рдирд╛ CI

рдПрдХ рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдЬреНрдЮрд╛рдд рдЬрд╛рдирд╡рд░ рд╣реИ, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╖реНрдард╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рддрд░рд╣, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ (RDBMS) рд╕реЗ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдЖрддреА рд╣реИрдВред
рдПрдХ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдЦрд╛рдирд╛ рдмрдирд╛рдирд╛ рдирд╣реАрдВ рд╕реАрдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡реНрдпрдВрдЬрди рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдХрдВрдХрд╛рд▓, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА PostgreSQL рдбреЗрдЯрд╛ рд╕реНрдХреАрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ pgTAP: github.com/C-Pro/pg_skeleton рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдФрд░ рдПрдХ рд╕реБрдЦрдж рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЯреНрд░реИрд╡рд┐рд╕ рдХреЛ рдпрд╣ рдмрд╛рдд рдмрддрд╛рдИ, рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рднреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА CI рд╣реЛ :)



рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рддреЛ, рдХреНрд░рдо рдореЗрдВ:

рдпрджрд┐ PostgreSQL рдЕрднреА рддрдХ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ - рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдмрдВрдЯреВ рдпрд╛ рдбреЗрдмрд┐рдпрди рд╣реИ, рддреЛ рдореИрдВ рдЙрдирдХреЗ apt.postgresql.org рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (рдХрдиреЗрдХреНрд╢рди рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: wiki.postgresql.org/wiki/Apt )ред рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ - рдЙрдмрдВрдЯреВ 13 рдкрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдкреИрдХреЗрдЬ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдПрд▓рдЯреАрдПрд╕ рд░рд┐рд▓реАрдЬ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

PgTAP рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ - PostgreSQL рдореЗрдВ рд╕рдм рдХреБрдЫ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛: pgtap.org

рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВ, рдлрд┐рд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣:
make && sudo make install 

Pgtap рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЕрдм рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

PgTpro рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП pg_prove - perl рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
 sudo cpan TAP::Parser::SourceHandler::pgTAP 


рд╕рдм рдХреБрдЫ, рдЖрдк pg_skeleton рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 git clone https://github.com/C-Pro/pg_skeleton.git cd pg_skeleton cp install.cfg.example install.cfg ./install.sh 

рдпрд╣ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛ - рдирд┐рд░реНрдорд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдорд╛рд▓рд┐рдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ:
 cd test ./run_tests.sh 

рдпрджрд┐ рдЖрдкрдиреЗ рдЬрд╛рджреВ рд╢рдмреНрдж PASS рджреЗрдЦрд╛ - рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдбреНрдбрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрдВрдХрд╛рд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдлрд╛рдЗрд▓ рд╕реЗред


рдкреНрд░рддреНрдпреЗрдХ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред

Test_user рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде test_user рд╕реНрдХреАрдорд╛ (рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдХреАрдорд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИрдВред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╡рд┐рднрд╛рдЬрди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд╕реЛрдВ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ, рд╡рд┐рджреЗрд╢реА рдмрд╛рдзрд╛рдУрдВ, рдХрд╛рд░реНрдпреЛрдВ, рд╡рд┐рдЪрд╛рд░реЛрдВ рдЖрджрд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдиреНрдпреЛрдиреНрдпрд╛рд╢реНрд░рд┐рддрд┐рдпреЛрдВ рдХреЗ рдЬрд╛рд▓ рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ install.sql рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
  create table a (x int references by); create table b (y int references ax); 


рдЯреЗрд╕реНрдЯ рдлреЛрд▓реНрдбрд░ рдПрдХ рд╕реНрдХреАрдорд╛ рднреА рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреАрдорд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рдкрд░реАрдХреНрд╖рдг рдЪрд▓ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред
setup.sql рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдЕрд╕реНрдерд╛рдпреА рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдПрдл-рд╡реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред (рдЙрд╣, рдХрд┐рддрдиреЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг :)
run_tests.sh, pg_prove рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ ред/tests/run_<name>.b рдПрдХ-рдПрдХ рдХрд░рдХреЗ
run_ <name> .sh рдХреЛ рдкреНрд░рддрд┐ рдпреЛрдЬрдирд╛ рдПрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, setup.sql рдлрд╝рд╛рдЗрд▓ рдЙрдирд╕реЗ рдЬреБрдбрд╝реА рд╣реИ - рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди test.test_scheme_check_func рдФрд░ рдлрд╝рд╛рдЗрд▓ test_data.sh рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ред рдлрд┐рд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмрд╕ run_ <name> .sh рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж, test.test_scheme_check_func рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ f-th рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ pgTAP рдкрд░реАрдХреНрд╖рдг рд╣реИ, рдЬреЛ рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдЧреИрд░-рдХрд╡рд░ рдПрдл-рдЯреА рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рджреГрдврд╝ рд╕рдВрдХрд▓реНрдк рдкрд░реАрдХреНрд╖рдг рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреЗрд╢рдХ, рдПрдХ рд╣реА рдирд╛рдо рд╡рд╛рд▓реА рдУрд╡рд░рд▓реЛрдб рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯреЗрд╕реНрдЯ рдХрд╡рд░реЗрдЬ рдкрд░ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд░реЛрд▓рдмреИрдХ рд╣реЛрддрд╛ рд╣реИ - рд╕рднреА рдирд┐рд░реНрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЦреИрд░, рдЕрдм рд╢рд╛рдпрдж рдпрд╣реА рд╣реИред
рдореБрдЭреЗ рдкрд╢реНрдЪрд╛рддрд╛рдк рд╣реБрдЖ, рдпрд╣ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдпрд╛ - рдкреВрдЫрд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ, рд╕рдордЭ, рдХрд╛рдВрдЯрд╛!

Source: https://habr.com/ru/post/In209584/


All Articles