弹簧集成测试速度慢,自动布线

2022-09-02 13:30:04

我正在尝试加快我们环境中的集成测试。我们所有的类都是自动连接的。在我们的应用程序Context.xml文件中,我们定义了以下内容:

<context:annotation-config/>
<context:component-scan base-package="com.mycompany.framework"/>
<context:component-scan base-package="com.mycompany.service"/>
...additional directories

我注意到Spring正在扫描上面指示的所有目录,然后迭代每个bean并缓存每个bean的属性。(我回顾了春季的DEBUG消息)

因此,运行以下测试大约需要 14 秒:

public class MyTest extends BaseSpringTest {
  @Test
  def void myTest(){
    println "test"
  }
}

有没有办法延迟加载配置?我尝试添加,但这不起作用。default-lazy-init="true"

理想情况下,仅实例化测试所需的 Bean。

提前致谢。

更新:我之前应该说过这一点,我不想为每个测试都有一个上下文文件。我也不认为一个仅用于测试的上下文文件会起作用。(此测试上下文文件最终将包含所有内容)


答案 1

如果确实想要加快应用程序上下文,请禁用<组件扫描,并在运行任何测试之前执行以下例程

Resource resource = new ClassPathResource(<PUT_XML_PATH_RIGHT_HERE>); // source.xml, for instance
InputStream in = resource.getInputStream();

Document document = new SAXReader().read(in);
Element root  = document.getRootElement();

/**
  * remove component-scanning
  */
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
    Element element = (Element) i.next();

    if(element.getNamespacePrefix().equals("context") && element.getName().equals("component-scan"))
        root.remove(element);
}

in.close();

ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(true);
for (String source: new String[] {"com.mycompany.framework", "com.mycompany.service"}) {
    for (BeanDefinition bd: scanner.findCandidateComponents(source)) {
        root
        .addElement("bean")
        .addAttribute("class", bd.getBeanClassName());
    }
}

//add attribute default-lazy-init = true
root.addAttribute("default-lazy-init","true");

/**
  * creates a new xml file which will be used for testing
  */ 
XMLWriter output = new XMLWriter(new FileWriter(<SET_UP_DESTINATION_RIGHT_HERE>));
output.write(document);
output.close(); 

除此之外,启用<context:annotation-config/>

由于您需要在运行任何测试之前执行上述例程,因此可以创建一个抽象类,您可以在其中运行以下内容

为测试环境设置 Java 系统属性,如下所示

-Doptimized-application-context=false

public abstract class Initializer {

    @BeforeClass
    public static void setUpOptimizedApplicationContextFile() {
        if(System.getProperty("optimized-application-context").equals("false")) {
            // do as shown above

            // and

            System.setProperty("optimized-application-context", "true"); 
        }

    }

}

现在,对于每个测试类,只需扩展初始值设定项


答案 2

一种方法是完全跳过自动检测,加载单独的上下文(包含测试所需的组件)或在运行时(在测试运行之前)重新定义 Bean。

此线程讨论 Bean 的重新定义以及用于执行此操作的自定义测试类:

单元测试环境中的弹簧豆重新定义


推荐