上周我发现自己不得不开始考虑如何重构一个只包含单元测试的旧应用程序。我的第一个想法是使用 Cucumber 添加一些组件测试场景,以熟悉业务逻辑并确保我的更改不会破坏任何内容。但那时我与我工作的公司的一位架构师进行了交谈,这让我想知道这是否值得,以及我必须实际测试的代码到底是什么。
此应用程序有许多不同类型的端点:要调用和调用的其余端点、Oracle 存储过程和 JMS 主题和队列。它部署在 Tomcat 服务器的 war 文件中,到代理的连接工厂和到数据库的数据源在服务器中配置并使用 JNDI 获取。
我的第一个想法是在嵌入式 Jetty 中加载整个应用程序,指向真正的 web.xml,以便加载所有内容,就像从生产环境加载一样,然后模拟连接工厂和数据源。通过这样做,将测试部署应用程序的基础设施的所有连接逻辑。考虑到六边形架构,考虑到这些只是逻辑应该只是将接收到的数据转换为应用程序数据的端口,这似乎太过分了。这不应该只是单元测试吗?
我的下一个想法是在我的测试中模拟存储过程并在没有任何 Web 服务器的情况下加载 Spring XML,这使得模拟类更容易。为此,我将使用 Spring MockMvc 等库作为其余端点,将 Mockrunner 用于 JMS。但同样,这种方法仍然会测试一些适配器并使测试复杂化,因为测试的结果将是 XML 和 JSON 有效负载。在此应用程序中完成的转换非常繁重,其中相同的消息类型可能包含不同版本的类(每个消息可能包含许多实现多个接口的复杂对象)。
所以现在我在想,也许最好的方法是创建从入口点到应用程序的测试,从适配器调用的服务,并验证负责向代理发送消息或调用其他 REST 的服务实际上调用了端点。然后只需确保对端点进行适当的单元测试,并通过提供一些在真实环境中执行的冒烟测试来验证部署后一切正常。这将测试连接逻辑,并且将单独测试业务逻辑,而不关心是否添加了新适配器或删除了适配器。
这种方法正确吗?我会在不以这种方式测试的情况下留下一些东西吗?还是还是太多了,我应该相信单元测试?
谢谢。