【问题标题】:TestNG for starting database before test runs and stopping afterwardsTestNG 用于在测试运行之前启动数据库并在之后停止
【发布时间】:2016-12-11 23:54:58
【问题描述】:

我目前正在尝试对我想通过 TestNG 启动的 mongoDB 运行一些测试。

套件应该:

  1. 启动一个 mongoDB 实例(可能是嵌入式或单独的进程)
  2. 运行一个或多个测试(可能在不同的类或包中)
  3. 停止 mongoDB 实例

我试过了:

<suite name="EmbeddedMongoSmokeTest" verbose="1">
<parameter name="mongoPort" value="27018"/>

<test name="EmbeddedMongoSmokeTest">
    <classes>
        <class name="com.frequentis.ps.platform.tests.persistence.EmbeddedMongoControllerTest">
            <methods>
                <include name="startEmbeddedMongoDb" />
            </methods>
        </class>
        <class name="com.frequentis.ps.platform.tests.persistence.MongoDBSmokeTest"/>
        <class name="com.frequentis.ps.platform.tests.persistence.EmbeddedMongoControllerTest">
            <methods>
                <include name="stopEmbeddedMongoDb" />
            </methods>
        </class>
    </classes>
</test>

@Test(groups = { "persistence", "mongodb"})
public class EmbeddedMongoControllerTest {
    private static EmbeddedMongoController mongoController;

    @Test
    @Parameters({ "mongoHost", "mongoPort"})
    public void startEmbeddedMongoDb(@Optional("localhost") String host, @Optional("27017") int port) {
        mongoController = new EmbeddedMongoController();
        mongoController.start(host, port);
    }

    @Test
    public void stopEmbeddedMongoDb() {
        mongoController.stop();
    }
}

我从 TestNG 运行器那里得到一个异常,它说“在 [DynamicGraph 中找不到空闲节点”,我猜这是因为我在一个测试部分中使用了同一个类两次。

我应该如何构建我的 TestNG 套件 xml 或者我应该使用什么样的 TestNG 功能来以干净的方式完成我的任务?

【问题讨论】:

  • 为什么不直接使用单例 - 也会是延迟初始化?

标签: testng


【解决方案1】:

你应该看看the TestNG documentation

顺便说一句,据我了解您的需求,您想在一组测试之前启动 mongo,然后在它们之后停止它。

您可以使用@Before/AfterGroup("mongodb")(但您必须激活该组,因为即使测试是该组的一部分,testng 也不会这样做)或@Before/AfterTest

public class EmbeddedMongoControllerTest {
    private static EmbeddedMongoController mongoController;

    @BeforeTest // or @BeforeGroup("mongodb")
    @Parameters({ "mongoHost", "mongoPort"})
    public void startEmbeddedMongoDb(@Optional("localhost") String host, @Optional("27017") int port) {
        mongoController = new EmbeddedMongoController();
        mongoController.start(host, port);
    }

    @AfterTest // @AfterGroup("mongodb")
    public void stopEmbeddedMongoDb() {
        mongoController.stop();
    }
}

<suite name="EmbeddedMongoSmokeTest" verbose="1">
  <parameter name="mongoPort" value="27018"/>

  <test name="EmbeddedMongoSmokeTest">
    <!--If @Before/AfterGroup usage <groups> 
      <run>
        <include name="mongodb"/>
      </run>
    </groups> -->

    <classes>
        <class name="com.frequentis.ps.platform.tests.persistence.EmbeddedMongoControllerTest">
        </class>
        <class name="com.frequentis.ps.platform.tests.persistence.MongoDBSmokeTest"/>
        </class>
    </classes>
  </test>

如果MongoDBSmokeTest extends EmbeddedMongoControllerTest,您可以从列表中删除EmbeddedMongoControllerTest

【讨论】:

  • 谢谢,我确实查看了文档,但找不到东西。现在我使用了 ISuiteListener,但我也会尝试你的方法。
  • 留住你的听众。 IMO 这是一种更好的方法,但适用于更高级的测试用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多