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

问题描述 投票:8回答:2

我在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 oscisPathMatchingResourcePatternResolver - 搜索目录DEBUG oscaConfigurationClassPostProcessor DEBUG oscaClassPathBeanDefinitionScanner DEBUG oscisPathMatchingResourcePatternResolver DEBUG osbfsDefaultListableBeanFactory DEBUG oacbconverters.ArrayConverter DEBUG org.dozer.loader.xml.XMLParser DEBUG org.hibernate.cfg.SettingsFactory DEBUG ohcfg.annotations.CollectionBinder DEBUG哦cfg.annotations.TableBinder DEBUG ohpwspi.MetamodelGraphWalker - 访问属性路径:MyEntity DEBUG osbfsDefaultListableBeanFactory DEBUG org.hibernate.SQL

为什么要这么“休”时间?我该怎么办?

java performance spring-boot testng
2个回答
0
投票

调查:

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

  1. @Configuration - 表示该类包含一个或多个@Bean方法。和@ComponentScan一起玩。
  2. @EnableAutoConfiguration - 将尝试猜测并配置您可能需要的bean。根据您的应用程序,这可能会导致性能下降。
  3. @ComponentScan - 配置组件扫描。由于未定义包,因此将使用此批注从类的包中进行扫描。

如果没有更多的代码,就无法给出准确的猜测,但我认为大部分性能损失都是由Spring Boot初始化引起的。


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>

并尝试给我们更多细节

© www.soinside.com 2019 - 2024. All rights reserved.