【问题标题】:How should I start server before JUnit test?在 JUnit 测试之前我应该​​如何启动服务器?
【发布时间】:2020-09-24 09:49:01
【问题描述】:

基本上我在这里为我的服务器进行了这个 JUnit 测试:

@Test
public void test() throws UnknownHostException, IOException, ClassNotFoundException
{
    Socket socket = new Socket("localhost", 4444);
    PrintWriter stringOut = new PrintWriter(socket.getOutputStream(), true);
    ObjectInputStream oIn = new ObjectInputStream(socket.getInputStream());

    stringOut.println("getMyString");
    String myString = (String) oIn.readObject();
    assertEquals("myString", myString);
    socket.close();
}

但是每次我想运行这个测试时,我都需要启动服务器。我应该如何让它自动启动(当然它必须在另一个线程中)

【问题讨论】:

  • 服务器似乎是测试设置的一部分...你没有设置方法吗?
  • @deHaar 服务器有一个main方法
  • 能否从测试代码启动,还是必须启动外部.exe或.jar才能让服务器运行?
  • 我要么从 jar 启动服务器,要么只使用 Eclipse 运行
  • 然后编写一个运行 jar 的@BeforeAll 方法... 使用ProcessBuilder 可能... 如果需要,编写另一个方法在测试后停止服务器。

标签: java multithreading unit-testing junit server


【解决方案1】:

使用 ProcessBuilder 启动进程,并使用 destroy() 销毁它

ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-jar", "your.jar");
pb.directory(new File("preferred/working/directory"));
Process p = pb.start();
Thread.sleep(1000);

// test here

p.destroy()

【讨论】:

  • 有没有办法不用每次都导出jar?
  • “导出”JAR 是什么意思?正如我在回答中所说:当你的测试类开始运行时,你可以这样做一次
  • 每次运行测试时都必须导出服务器 jar。
【解决方案2】:

技术上的答案可能是让socket 成为您的测试类中的一个字段,然后使用@BeforeAll public static void setUp() 方法创建所需的对象一次。或者 @Before public void setUp() 在每个测试用例之前启动服务器。当然,您需要匹配 @AfterAll resp。 @After 方法。正如其他答案所述,您可以使用 ProcessBuilder 例如,启动一个完全自己的流程。

但是:“真正的”单元测试应该只依赖于您的源代码。像这里这样的依赖项,需要 external 组件/服务可用,而不是呈现这些功能或集成测试。

所以,真正的答案是:退后一步。查看您的服务器代码,并问自己是否真的需要运行整个服务器来测试它的各个部分。

含义:归根结底,“服务器”是关于向外部世界提供一些“业务逻辑”。这是两个不同的问题,应该以不同的方式解决。

所以:您为您的业务逻辑编写单元测试,这些测试都可以在没有任何服务器的情况下进行很好的测试。然后您编写更多的集成测试来测试您的服务器是否与业务逻辑部分正确“耦合”。

换句话说:假设您的服务器提供 3 种不同的服务,并且每一种服务都有多个参数和执行“路径”。您绝对不会通过通过您的服务器来测试所有这些服务,包括所有参数变化和所有“路径”。相反,您编写代码以便可以完全测试每个服务,而无需为每个测试启动服务器。然后,当 所有 工作正常时,您编写一些测试以确保可以使用服务器调用每个服务(并且您专注于非常不同的方面,例如:“传递给*inside 显示的服务”,或者“是服务器按预期处理的业务逻辑中的错误”)。

【讨论】:

  • 是的,我已经为服务器业务逻辑编写了单元测试。我只想做一个测试,通过发送一个请求来测试服务器是否真的工作。我使用 processbuilder 来启动 jar。我必须记住每次都导出它......
猜你喜欢
  • 2018-01-14
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多