рдЯреАрдорд╕рд┐рдЯреА рдлреНрд▓рд╛рдИ рдкрд░ рдЬрдиреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рдирд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдорд╛рдирдХ рд╕рдорд░реНрдерди рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрднреА рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░реАрдХреНрд╖рдг рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЕрдиреНрдп рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИрдВ jUnitред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреМрди рд╕реЗ рдирд╣реАрдВред рдФрд░ рдмрд┐рдирд╛ рдЕрдирджреЗрдЦреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ TeamCity рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рдеред
рдпрд╣ рдХрднреА-рдХрднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреНрд░рд╛рдордХ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдереА рдЬрд╣рд╛рдВ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рдЧрдП рдереЗ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЦреБрдж рд╣реА рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ (рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рд░реЛрдХрдиреЗ / рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рдерд╛), рд▓реЗрдХрд┐рди рдЯреАрдо рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдлрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕рднреА рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдХрд╣рд╛ "рдХреНрдпрд╛ ..."ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдорд╕рд┐рдЯреА рд╕реЗрд╡рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди TeamCity рдореЗрдВ рдПрдХ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ TestOutput рдореЗрдВ рд╕реЗрд╡рд╛ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
1. рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред TeamCity рдХреЛ рдХрдорд╛рдВрдб рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдорд╛рдирдХ рдЖрдЙрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред
public class Log { public static void logTCTestSuiteStart( String message ) { System.out.println( "##teamcity[testSuiteStarted name='" + message + "']" ); } public static void logTCTestSuiteFinished( String message ) { System.out.println( "##teamcity[testSuiteFinished name='" + message + "']" ); } public static void logTCTestStart( String message ) { System.out.println( "##teamcity[testStarted name='" + message + "']" ); } public static void logTCTestFinished( String message ) { System.out.println( "##teamcity[testFinished name='" + message + "']" ); } public static void logTCTestFailed( String message, AssertionError e ) { System.out.println( "##teamcity[testFailed name='" + message + "' message='" + e.getMessage() + "']" ); } }
рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдореВрд╣ рдХреЛ '
TestSuiteStarted ' рдФрд░ '
testSuiteFinished ' рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TestSuite рдмреНрд▓реЙрдХ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рд╛ '
рдЯреЗрд╕реНрдЯрд╕реНрдЯрд╛рд░реНрдЯреЗрдб ' рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ '
рдЯреЗрд╕реНрдЯрдлрд┐рдирд┐рд╢реНрдб ' рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдкрд░реАрдХреНрд╖рдг рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ '
testFailed ' рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдк рдЯреАрдорд╕рд┐рдЯреА рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╕реЗрд╡рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
2. рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг
рдЕрдм рд╣рдо рдЗрд╕ рддрд░рд╣ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
public class BasicTests1 { BasicTester tester = new BasicTester( {constructor_args} ); @BeforeClass public static void setUp() { tester.initialize(); } @Test public void orderedTestRun() throws Exception { Log.logTCTestSuiteStart( "Basic tests" ); tester.testOne(); tester.testTwo(); tester.testThree(); Log.logTCTestSuiteFinished( "Basic tests" ); } @AfterClass public static void tearDown() { tester.dispose(); } } public class BasicTester { protected {field1}; protected {field2}; protected {field3}; protected BasicTester( {class_fields} ); protected void testOne() { Log.logTCTestStart( "testOne" ); try { //test logic } catch( AssertionError e ) { Log.logTCTestFailed( "testOne", e ); } Log.logTCTestFinished( "testOne" ); } protected void testTwo() { Log.logTCTestStart( "testTwo" ); try { //test logic } catch( AssertionError e ) { Log.logTCTestFailed( "testTwo", e ); } Log.logTCTestFinished( "testTwo" ); } protected void testThree() { Log.logTCTestStart( "testThree" ); try { //test logic } catch( AssertionError e ) { Log.logTCTestFailed( "testThree", e ); } Log.logTCTestFinished( "testThree" ); } }
рдЪреВрдВрдХрд┐ рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкрдХрдбрд╝рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЙрдиреНрд╣реЗрдВ рдмрд╕ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ TeamCity, рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдЖрджреЗрд╢ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдлрд▓ рдорд╛рдиреЗрдВрдЧреЗред
3. рдЪреАрдВрдЯреА рдХрд╛ рдХрд╛рд░реНрдп
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдорд╛рдирдХ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ '
рдЬреВрдирд┐рдЯ ' рдХрд╛рд░реНрдп рдореЗрдВ '
showoutput = "yes" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЯреЗрд╕реНрдЯрдСрдЙрдЯрдЖрдЙрдЯ рдХреЛ рдорд╛рдирдХ рдЖрдЙрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░реЗрдЧрд╛ред
4. рдЯреАрдорд╕рд┐рдЯреА рдмрд┐рд▓реНрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕
рдЪреВрдВрдХрд┐ TeamCity TestOutput рдЬреВрди рд╕реЗ рд╕реЗрд╡рд╛ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреВрдирд┐рдпрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЦреЛрд▓реЗрдВ, 'рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдПрдБ' рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рдореНрди рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ:
- system.teamcity.ant.junit-support.enabled = false
- system.teamcity.ant.testng-support.enabled = false
рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм рдЖрдк рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ TeamCity рдореЗрдВ jUnit рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдореЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред