TestNG用于在测试运行之前启动数据库,然后停止

TestNG用于在测试运行之前启动数据库,然后停止,testng,Testng,我目前正在尝试对mongoDB运行一些测试,我想通过TestNG启动它 套房应: 启动mongoDB实例(可能是嵌入式或独立进程) 运行一个或多个测试(可能在不同的类或包中) 停止mongoDB实例 我试过这个: <suite name="EmbeddedMongoSmokeTest" verbose="1"> <parameter name="mongoPort" value="27018"/> <test name="EmbeddedMongoSmokeTes

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

套房应:

  • 启动mongoDB实例(可能是嵌入式或独立进程)
  • 运行一个或多个测试(可能在不同的类或包中)
  • 停止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>
    
    我从TestNG运行程序得到一个异常,它说“在:[DynamicGraph]中找不到空闲节点”,我想这是因为我在一个测试部分中使用了同一个类两次

    我应该如何构造我的TestNG套件xml,或者我应该使用什么样的TestNG特性以干净的方式完成我的任务?

    您应该看看

    顺便说一句,据我所知,您需要在一组测试之前启动mongo,然后在测试之后停止

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

    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>
    
    公共类EmbeddedMongoControllerTest{
    私有静态嵌入式mongoController mongoController;
    @BeforeTest//或@BeforeGroup(“mongodb”)
    @参数({“mongoHost”、“mongoPort”})
    public void startEmbeddedMongoDb(@Optional(“localhost”)字符串主机,@Optional(“27017”)int-port){
    mongoController=新的EmbeddedMongoController();
    mongoController.start(主机、端口);
    }
    @后测//后测组(“mongodb”)
    public void stopEmbeddedMongoDb(){
    mongoController.stop();
    }
    }
    
    如果
    MongoDBSmokeTest扩展了EmbeddedMongoControllerTest
    ,您应该查看一下,那么您可以从列表中删除
    EmbeddedMongoControllerTest

    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>
    
    顺便说一句,据我所知,您需要在一组测试之前启动mongo,然后在测试之后停止

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

    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>
    
    公共类EmbeddedMongoControllerTest{
    私有静态嵌入式mongoController mongoController;
    @BeforeTest//或@BeforeGroup(“mongodb”)
    @参数({“mongoHost”、“mongoPort”})
    public void startEmbeddedMongoDb(@Optional(“localhost”)字符串主机,@Optional(“27017”)int-port){
    mongoController=新的EmbeddedMongoController();
    mongoController.start(主机、端口);
    }
    @后测//后测组(“mongodb”)
    public void stopEmbeddedMongoDb(){
    mongoController.stop();
    }
    }
    

    如果
    MongoDBSmokeTest扩展了EmbeddedMongoControllerTest
    ,您可以从列表中删除
    EmbeddedMongoControllerTest

    谢谢,我确实查看了文档,但没有发现什么。现在我使用了ISuiteListener,但我也会尝试您的方法。保留您的侦听器。在我看来,这是一个更好的方法,但需要更多高级testng用户。谢谢,我确实查看了文档,但没有发现什么。现在我使用ISuiteListener,但我也会尝试你的方法。保留你的侦听器。在我看来,这是一种更好的方法,但对于更高级的testng用户来说。为什么不直接使用单例进行初始化呢?这也会导致延迟初始化?为什么不直接使用单例进行初始化呢这也会是延迟初始化吗?
    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>