рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ: рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдЬрд╛рдВрдЪ рдкрд░ рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рддреЗ рд╣реИрдВ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореЗрд░рд╛ рдирд╛рдо Egor Danilenko рд╣реИред рдореИрдВ Sberbank Business Online рдХреЗ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЗрдВрдЯрд░рдиреЗрдЯ рдмреИрдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдИ рдЧрдИ CI рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдбреЗрд╡рд▓рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд░рд┐рд▓реАрдЬрд╝ рд╢рд╛рдЦрд╛ рдореЗрдВ рдПрдХ рдЬрд▓рд╕реЗрдХ рдХреИрд╕реЗ рдЖрддреЗ рд╣реИрдВ? рдбреЗрд╡рд▓рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдзрдХреЗрд▓рддрд╛ рд╣реИред рд╣рдо рдПрдХ рд▓реЗрдЦрдХ рдХреЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдмрд┐рдЯрдмрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдордиреЗ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛)ред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрдХрд╛рдИ, рдПрдХреАрдХрд░рдг, рдХрд╛рд░реНрдпрд╛рддреНрдордХ)ред рдпрджрд┐ рдЕрд╕реЗрдВрдмрд▓реА рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реБрдИ рдФрд░ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдП, рд╕рд╛рде рд╣реА рдПрдХ рд╕рдлрд▓ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж, рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ред

рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде, рдЯреАрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝реА рд╣реИред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝реА рд╣реИред рд╣рдо рд╕рдордЭ рдЧрдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдХрдИ рдЯреАрдореЗрдВ "рдзреАрдореА рдкреБрд▓-рдЕрдиреБрд░реЛрдз-рдЬрд╛рдВрдЪ" рд╕рдорд╕реНрдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдПрдВрдЧреА, рдФрд░ рдЙрддреНрдкрд╛рдж рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ 40 рдЯреАрдореЗрдВ рд╣реИрдВред рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╡реЗ рдирдП рдкрд░реАрдХреНрд╖рдг рд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рднреА рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдФрд░ рдЗрд╕ рддрд░рд╣ рд╣рдордиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдФрд░ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рд╛рдЗрд▓ "рдЫреБрдЖ" рд╣реЛрдиреЗ рдкрд░ рдХрд┐рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рд╕рднреА EclEmma JaCoCo рдХреЛрдб рдХрд╡рд░реЗрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ред

JaCoCo рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛


JaCoCo рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдХрд╛рдо рдХреЛрдб рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдПрдЬреЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреЗрд╡реАрдПрдо рдХреЗ рдЕрдиреБрд░реЛрдз рдпрд╛ рд╢рдЯрдбрд╛рдЙрди рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рддреАрди рддрд░реАрдХреЗ рд╣реИрдВ:

  1. рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо: JVM рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛ рдПрдХ рдлрд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
  2. рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░: рдЖрдк рдмрд╛рд╣рд░реА рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЬреЗрд╡реАрдПрдо рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  3. TCP рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ: рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, JaCoCo рдПрдЬреЗрдВрдЯ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ TCP рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред

рд╣рдордиреЗ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рд╣реИред

рдирд┐рд░реНрдгрдп


рдЖрдкрдХреЛ JaCoCo рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо JaCoCo рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЬрд╛рд╡рд╛ рдПрдЬреЗрдВрдЯ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2] 

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:

 dependencies { compile 'org.jacoco:org.jacoco.agent:0.8.0' } 

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдБрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде withJacoco рдзреНрд╡рдЬ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛрдХрд┐ gradle.properties рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИред рд╣рдо рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдБрдХрдбрд╝реЗ, рдкрддрд╛ рдФрд░ рдкреЛрд░реНрдЯ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рдкрд░реАрдХреНрд╖рдг рд▓реЙрдиреНрдЪ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде jvm рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ:

 if (withJacoco.toBoolean()) { тАж jvmArgs "-javaagent:${tempPath}=${jacocoArgs.join(',')}".toString() } 

рдЕрдм, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ JaCoCo рдХреЗ рд╕рд╛рде рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TestNG рд╢реНрд░реЛрддрд╛ рд▓рд┐рдЦреЗрдВред

 public class JacocoCoverageTestNGListener implements ITestListener { private static final IntegrationTestsCoverageReporter reporter = new IntegrationTestsCoverageReporter(); private static final String TEST_NAME_PATTERN = "%s.%s"; @Override public void onTestStart(ITestResult result) { reporter.resetCoverageDumpers(String.format(TEST_NAME_PATTERN, result.getInstanceName(), result.getMethod().getMethodName())); } @Override public void onTestSuccess(ITestResult result) { reporter.report(String.format(TEST_NAME_PATTERN, result.getInstanceName(), result.getMethod().getMethodName())); } } 

Testng.xml рдореЗрдВ рдПрдХ рд╢реНрд░реЛрддрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдЯрд┐рдкреНрдкрдгреА рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ JaCoCo рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЖрдБрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЛрд░реНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ред
рд░рд┐рдкреЛрд░реНрдЯрд░ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдЖрдВрдХрдбрд╝реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд░рд┐рдкреЛрд░реНрдЯ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 public void report(String test) { reportClassFiles(test); reportResources(test); } 

ReportClassFile рд╡рд┐рдзрд┐ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ jvm рдлреЛрд▓реНрдбрд░ рдмрдирд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рд╕ рдлрд╛рдЗрд▓реНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░рд┐рдд рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

ReportResource рд╡рд┐рдзрд┐ рд╕рдВрд╕рд╛рдзрди рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдПрдХрддреНрд░рд┐рдд рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ (рд╕рднреА рдЧреИрд░-рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП)ред

рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдПрдЬреЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рдиреЗ, рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рднреА рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред JaCoCo рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдФрдЬрд╛рд░реЛрдВ рдЬреИрд╕реЗ рдХрд┐ org.jacoco.core.runtime.emoteControlReader / RemoteControlWriter рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

ReportClassFiles рдФрд░ reportResources рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдбрдВрдкрдЯреЙрдпрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 public void dumpToFile(File file) { try (Writer fileWriter = new BufferedWriter(new FileWriter(file))) { for (RemoteControlReader remoteControlReader : remoteControlReaders) { remoteControleReader.setExecutionDataVisitor(new IExecutionDataVisitor() { @Override public void visitClassExecution(ExecutionData data) { if (data.hasHits()) { String name = data.getName(); try { fileWriter.write(name); fileWriter.write('\n'); } catch (IOException e) { throw new RuntimeException(e); } } } }); } } } 

рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрдХреНрд╖рд╛рдУрдВ / рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдХреНрд╖рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИред

рдпрд╣ рджреИрдирд┐рдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд▓рд┐рдЦрдиреЗ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдЪреЗрдХ рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд▓реЙрдиреНрдЪ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред

рд╣рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдордВрдЪ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

 stage('Agregate and parse result') { def inverterInJenkins = downloadMavenDependency( url: NEXUS_RELEASE_REPOSITORY, group: '', name: 'coverage-inverter', version: '0', type: 'jar', mavenHome: wsp ) dir('coverage-mapping') { gitFullCheckoutRef '', '', 'coverage-mapping', "refs/heads/${params.targetBranch}-integration-tests" sh 'rm -rf *' } sh "ls -lRa ..//out/coverage/" def inverter = wsp + inverterInJenkins.substring(wsp.length()) sh "java -jar ${inverter} " + "-d ..//out/coverage/jvm " + "-o coverage-mapping//jvm " + "-i coverage-config/jvm-include " + "-e coverage-config/jvm-exclude" sh "java -jar ${inverter} " + "-d ..//out/coverage/resources " + "-o coverage-mapping//resources " + "-i coverage-config/resources-include " + "-e coverage-config/resources-exclude" gitPush '', '', 'coverage-mapping', "${params.targetBranch}-integration-tests" } 

рдХрд╡рд░реЗрдЬ-рдореИрдкрд┐рдВрдЧ рдореЗрдВ, рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЖрдВрдХрдбрд╝реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдирд╛рдо рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рдЙрд▓рдЯрдиреЗ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ (рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ) рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рдЕрдкрдиреЗ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рдЙрд▓рдЯ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рднрдВрдбрд╛рд░ рдкрд░ рдзрдХреЗрд▓ рджреЗрддреЗ рд╣реИрдВред

рд╣рд░ рд░рд╛рдд рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЬ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд┐рдВрдЧреЛ!

рдЕрдм, рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдвреВрдВрдврдиреА рд╣реЛрдЧреА рдФрд░ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдордиреЗ рдЬрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛:

  • рдЪреВрдВрдХрд┐ JaCoCo рдХреЗрд╡рд▓ bytecode рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЙрдХреНрд╕ рд╕реЗ .xml, .gradle, .sql рдЬреИрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдлреИрд╕рд▓реЛрдВ рдХреЛ "рдЬрдХрдбрд╝рдирд╛" рдкрдбрд╝рд╛ред
  • рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреА рд▓рдЧрд╛рддрд╛рд░ рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрдпрджрд┐ рд░рд╛рдд рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ "рдХрд▓" тАЛтАЛрдХреЗ рдЖрдБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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


All Articles