使用Web服务器运行集成测试的最佳方式是什么?
正如标题所说,我对使用Jetty Web服务器测试应用程序的最佳方法感兴趣,并考虑到您不想为每个特定测试启动/停止测试服务器。使用Web服务器运行集成测试的最佳方式是什么?
据我所知,这些都是解决方案:
-
,如果你使用像Maven的或摇篮构建工具,你可以在
*.pom
或*.gradle
文件做到这一点。- 这样做的缺点是您必须以不同的方式创建测试服务器,而您通常在应用程序中执行此操作。
-
创建一个测试套件,并使用
@BeforeClass
和@AfterClass
注释启动/停止前/服务器测试Suite
后。- 缺点在于指定测试运行的“丑陋”方式。您还必须指定添加到套件的测试,它不应该在套件外运行(避免重复运行测试)。我认为Junit还没有完全配备这个。
-
创建,并在试验开始启动服务器以静态方式,并使用
ShutDown
机制在JVM挂钩,当所有的测试完成后自动停止服务器。这似乎是最好的解决方案,因为这种机制已经在Jetty中可用,但是- 缺点是您无法控制服务器的停止。它是在一个完全不同的线程实际完成的,即使外面的建筑工具的(我用摇篮本)
我们做#2的几乎所有我们的测试在码头本身。创建一个嵌入式服务器并部署一个应用程序,一个servlet或者任何你喜欢的东西真的很容易。这使您不仅可以运行自动化测试,而且还可以简单地在IDE中调试应用程序,而无需IDE的所有工具开销。所以从Jetty的角度来看,我们是在测试中创建测试套件并根据需要启动和停止服务器的忠实粉丝。我们有测试案例,我们启动多台服务器并测试它们之间的会话到期时间,其他时间我们启动一台服务器,并使用我们的异步jetty客户端来抛弃10k客户端连接。只需运行jetty的完整版本即可启动并停止数百个码头服务器实例。
不是每个应用都可以这样连接起来,有些有外部数据库需求等,但即使在那里,您也经常有能力针对像德比这样的内存数据库编写单元测试,这是划分您的试验。如果你绝对需要一个运行测试的环境,那么很多人都会碰到maven,jetty-maven-plugin和硒之类的东西,但我通常认为这些是更多的功能测试,或者验收测试场景,实际的单元测试应该是至少在联合测试的范围内完成......至少。
我们使用詹金斯使用Build Pipeline Plugin建管道。第一份工作启动构建并创建一个工件,其中包含所有已编译的代码,包括WAR文件和所有已编译的测试代码。
然后,下游作业拉开序幕其部署WAR文件到现场Tomcat服务器。
随后我们有运行集成测试(获得从上游构建的测试工件测试)对现场Tomcat服务器的工作。
还有比这更给它,但这是一般的想法。
如何指定在一个套件运行测试?使用套件上的'@ SuiteClasses'注释还是动态方法?此外,当您从IDE运行junit测试时,除了套件外,实际测试还将再次运行。你如何忽略实际测试,以便不再运行?感谢你的回答! – Mircea
在jetty中,我们的测试只需使用@Test进行注释,并遵循FooTest.class的命名约定,然后使用maven surefire插件在正常构建期间运行它们。在像eclipse这样的IDE中,你可以运行单独的测试,或者你可以运行测试目录。如果你有测试运行两次,我会说这是IDE本身的配置问题,而不是任何事情。 –
可能是因为我不够明确。当我说Suite时,我指的是'org.junit.runners.Suite'。如果你创建一个测试与此批注,则您必须指定'org.junit.runners.Suite.SuiteClasses'注释,其中包括要添加到'org.junit.runners.Suite'的测试类。只要指定的测试类只是正常的junit4测试类,即使它们是从maven运行的,它们也会运行。 Maven不知道这些测试类是在'org.junit.runners.Suite'注释中定义的,并且也将由那个junit运行器运行。 – Mircea