рдореИрдВ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП C рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХрдард┐рди рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
C рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрднреА рд╣реИ рдЬрдм рдЖрдкрдХреА рдЧрдгрдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддрдХ рдкрд╣реБрдВрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐
рд░реВрдмреА рдпрд╛
рдкрд╛рдпрдерди (рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдПрдХ рдорд╛рдирдХ рднрд╛рд╖рд╛, рдЧрдгрд┐рдд рд╕реЗ рдЬреАрд╡ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдкреИрдХреЗрдЬ) рдпрд╛, рдмреЗрд╣рддрд░, рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдкреИрдХреЗрдЬ рдЬреИрд╕реЗ
рдЛрд╖рд┐ (рдПрдХ рдЕрдЬрдЧрд░ рдРрдб-рдСрди рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде) рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЧрдгрдирд╛рдУрдВ рдФрд░ рдмрд╣реБрдд рд╕реА рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдиреНрдп рдЧрдгрд┐рддреАрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдЛрд╖рд┐ рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЛрд╖рд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдВрджрд░ рд╣реА; рд╡реИрд╕реЗ,
рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдм рдкрд░ рдЛрд╖рд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд▓рд┐рдЦрд╛ )ред
рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдЖрдк рд╕реА рдХреЛрдб рдХреЛ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдЪрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ
рд╕рд╛рдЗрдерди (рдЬрд┐рдирдХреЗ рд▓реЗрдЦрдХ рдЛрд╖рд┐ рдХреЗ рд▓реЗрдЦрдХ рднреА рд╣реИрдВ), рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП, рд╕реА рдХреЛрдб рдореЗрдВ рд▓рдЧрднрдЧ рдкрд╛рдпрдерди рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдореИрдВ рдЖрдкрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВ: рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдпрд╛ рдЕрдиреНрдп рдЧрдгрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП C рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЛрдЪреЗрдВ! рдирд╣реАрдВ рддреЛ рдЪрд▓рд┐рдП!
рддреЛ, рдЖрдкрдиреЗ рдЕрднреА рднреА рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдЧрдгрдирд╛ рд╣реИ рдпрджрд┐ рдХреЛрдб рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЦреИрд░, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдЪреНрдЪ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЪреБрдирдиреЗ рдХреЗ рд╡рд┐рд╖рдп
рдкрд░ ,
рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ
рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╢рд╛рдЦрд╛ ,
рд╣рдм рдкрд░ рдПрдХ
рдкреЛрд╕реНрдЯ ,
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рддреБрд▓рдирд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
рд╕реА рдФрд░ рд╕реА ++ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рд▓рд┐рдП rspec рд╣реИ (рдореИрдВрдиреЗ рддреБрд░рдВрдд рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛)ред
рдЗрд╕ рд╕рднреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдореЗрдВ рд╕реЗ,
Google рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕реБрдЦрдж рд▓рдЧрд╛ (рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдм рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА
рд▓рд┐рдЦрд╛ )ред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореИрдВ, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рд╕реА рднрд╛рд╖рд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрд╣реБрдд рдЕрдиреБрднрд╡реА рдирд╣реАрдВ рд╣реИ, рдЙрд╕реЗ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдмрдВрдЯреВ рдореЗрдВ рдорд╛рдирд╡реАрдп рд░реВрдк рд╕реЗ рд▓рд╛рдирдд рдкрд░реАрдХреНрд╖рдг рд╕рдВрдХрд▓рди рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ!)ред рдпрд╣ рдкреНрд░рд╢реНрди рд▓рдЧрднрдЧ рдХрднреА рднреА рдареАрдХ рд╕реЗ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, "рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╕реЗрд╕реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдФрд░ README рдХреЗ тАЛтАЛрдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ", рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдирд╡ рд╕реЗ рджреВрд░ рд╣реИ, рдпрд╛ рдкреБрд░рд╛рдиреЗ Ubuntu (11.10 рд╕реЗ рдЕрдзрд┐рдХ рдкреБрд░рд╛рдиреЗ) рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ Oneiric Ocelotред
рдореЗрд░реЗ рд╕рднреА
sudo apt-get install libgtest-dev
рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдкрд╛рда рдерд╛: Ubuntu 11.10 рдкрд░ рд╕реНрдерд╛рдкрдирд╛
sudo apt-get install libgtest-dev
(рдпрд╛ рдлрд┐рд░
yaourt -S gtest
рдореЗрдВ
yaourt -S gtest
gtest) рдЖрддреА рд╣реИред рдлрд┐рд░ рдЖрдкрдХреА рдлрд╝рд╛рдЗрд▓ my_app_test.cpp рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
#include "gtest/gtest.h" int add(int value1, int value2) { return (value1 + value2); } TEST (AddTest, PositiveNos) { EXPECT_EQ (16, add(8, 8)); }
рдЬрд╣рд╛рдВ AddTest рдкрд░реАрдХреНрд╖рдг рд╕рдореВрд╣ рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░ PositiveNos рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдирд╛рдо рд╣реИред EXPECT_EQ, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд▓рдЧрднрдЧ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдПрдирд╛рд▓реЙрдЧ
assert 16 == 8+8
ред рд╣рд╛рд▓рд╛рдБрдХрд┐, ASSERT_TRUE рднреА
рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рд╣реИ ред
рд╕рдм рдХреБрдЫ, рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рд╣реИред рдмреЗрд╢рдХ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЖрдкрдХреЛ
#include "my_app.h"
рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдореЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ рдЙрд╕рдХреЗ рд╕рд╛рде рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
g++ my_app_test.cpp -lgtest_main -lgtest -pthread && ./a.out
рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИред
рд░реВрд╕реА рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдореИрдВ рдПрдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рд░рди (рд▓рд╛рд▓) рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛

рдФрд░ рд╕рдлрд▓ (рд╣рд░рд╛)

рдкрд░реАрдХреНрд╖рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЦрдмрд░ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рд╡реЙрдЪ рдЯреВрд▓ (рд░реВрдмреА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рдФрд░ рдЕрдЪреНрдЫреА рд╕реВрдЪрдирд╛рдПрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд╛рдкрд┐рдд рд▓рд┐рдмрд░рдиреЛрдЯрд╛рдЗрдм рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрдВрджрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо рдорд╛рдгрд┐рдХ рдбрд╛рд▓рддреЗ рд╣реИрдВ (рд╡реЙрдЪреНрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ) рдФрд░ рдХрд╛рдореЛрддреНрддреЗрдЬрдирд╛:
sudo apt-get install ruby libnotify4
, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж watchr:
sudo gem install watchr
ред
рд╡реЙрдЪреНрд░реНрдЯ рдлрд╛рдЗрд▓
рдХреЛ рдпрд╣рд╛рдВ рд╕реЗ рд▓реЗ рдЬрд╛рдПрдВред рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд╛рда рджреВрдВрдЧрд╛:
ENV["WATCHR"] = "1" system 'clear' def run(cmd) puts(cmd) system(cmd) end def growl(result) message = result ? "OK" : "FAILED" growlnotify = `which notify-send`.chomp title = "Watchr Test Results" image = (result) ? ".watchr_images/passed.png" : ".watchr_images/failed.png" options = %("#{title}" "#{message}" -i #{File.expand_path(image)}) system %(#{growlnotify} #{options} &) end watch( '(.+)(\.c|_test\.cpp|\.h)$' ) do |md| result = run("g++ #{md[1]}_test.cpp #{md[1]}.c -lgtest_main -lgtest -pthread -o #{md[1]}_test && ./#{md[1]}_test") growl result puts ("\n\n") end
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
watchr watchr.rb
рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
watchr watchr.rb
ред