在spring boot中使用testNG进行单元测试需要时间来构建项目

时间:2015-05-27 10:37:37

标签: java performance spring-boot testng

我在spring-boot中创建了一个Web应用程序。我正在使用testNG为我的业务层编写单元测试。

我创建了Application类

@SpringBootApplication
public class TestApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(TestApplication.class, args);
    }

    @Bean
    Mapper mapper()
    {
        List<String> mappingFiles = new ArrayList<String>();
        mappingFiles.add("dozer-mappings.xml");
        return new DozerBeanMapper(mappingFiles);
    }
}

我的测试类看起来像

@ContextConfiguration(classes = { TestApplication.class })
public class CommissionRuleServiceTest extends AbstractTestNGSpringContextTests
{
     @InjectMocks
     @Autowired
     MyService

     @Mock
     MyDAO;

     @BeforeMethod
     public void initMock()
     {
          MockitoAnnotations.initMocks(this);
     }

     @Test(dataProvider = "....")
     ......
     ......
}

当我运行项目时,它会显示休息登录控制台,只需几次小测试就需要20.00秒。 日志中的一些语句是

  

DEBUG o.s.c.i.s.PathMatchingResourcePatternResolver - 搜索目录   DEBUG o.s.c.a.ConfigurationClassPostProcessor   DEBUG o.s.c.a.ClassPathBeanDefinitionScanner   DEBUG o.s.c.i.s.PathMatchingResourcePatternResolver   DEBUG o.s.b.f.s.DefaultListableBeanFactory   DEBUG o.a.c.b.converters.ArrayConverter   DEBUG org.dozer.loader.xml.XMLParser   DEBUG org.hibernate.cfg.SettingsFactory   DEBUG o.h.cfg.annotations.CollectionBinder   DEBUG o.h.cfg.annotations.TableBinder   DEBUG o.h.p.w.spi.MetamodelGraphWalker - 访问属性路径:MyEntity   DEBUG o.s.b.f.s.DefaultListableBeanFactory   DEBUG org.hibernate.SQL

为什么要这样一个&#34;休?&#34;时间?我该怎么办?

2 个答案:

答案 0 :(得分:0)

调查:

@SpringBootApplication注释等效于以下默认属性的注释:

  1. @Configuration - 表示该类包含一个或多个@Bean方法。与@ComponentScan一起播放。

  2. @EnableAutoConfiguration - 将尝试猜测并配置您可能需要的bean。 这可能会导致一些性能下降,具体取决于您的应用程序。

  3. @ComponentScan - 配置组件扫描。由于未定义包,因此将使用此注释从类的包中进行扫描。
  4. 如果没有更多的代码,就无法给出准确的猜测,但我认为大部分性能损失是由Spring Boot初始化引起的

答案 1 :(得分:0)

默认情况下,Spring Boot中的日志记录级别设置为INFO,可能你改变了吗? 将其添加到application.properties或您需要的任何其他级别(TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF)

logging.level.root = WARN

如前所述,自动配置可能会影响性能。 您可以使用排除某些不需要的配置。 这是一个例子(随机集 - 不要盲目跟随)

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
        ErrorMvcAutoConfiguration.class, SecurityAutoConfiguration.class, SessionAutoConfiguration.class,
        ValidationAutoConfiguration.class, ThymeleafAutoConfiguration.class, WebSocketAutoConfiguration.class,
        DispatcherServletAutoConfiguration.class, EmbeddedServletContainerAutoConfiguration.class,
        JmxAutoConfiguration.class, MultipartAutoConfiguration.class, WebMvcAutoConfiguration.class,
        JacksonAutoConfiguration.class, SpringApplicationAdminJmxAutoConfiguration.class,
        MessageSourceAutoConfiguration.class, SendGridAutoConfiguration.class, FreeMarkerAutoConfiguration.class,
        GroovyTemplateAutoConfiguration.class, DeviceDelegatingViewResolverAutoConfiguration.class,
        SitePreferenceAutoConfiguration.class, MustacheAutoConfiguration.class,
        PersistenceExceptionTranslationAutoConfiguration.class})

对于测试类我建议使用

@SpringBootTest(classes = TestApplication.class)

如果您在测试中不需要它,也可以排除Tomcat

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

并尝试向我们提供更多详情