Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在测试自动化项目中使用单例控制器的优缺点是什么_Multithreading_Thread Safety_Testng - Fatal编程技术网

Multithreading 在测试自动化项目中使用单例控制器的优缺点是什么

Multithreading 在测试自动化项目中使用单例控制器的优缺点是什么,multithreading,thread-safety,testng,Multithreading,Thread Safety,Testng,我正在创建一个测试自动化项目,希望它能被TESTNG使用。我计划在自动化项目中使用MVC架构,并考虑创建控制器单例。因此,您想知道它的优缺点,因为它将被支持多线程的TESTNG访问/使用。在测试自动化中,或者通常您应该避免使用单线程。 特别是在java中,通常不能为新的测试用例重置单例。 这导致了新的tets案例使用singelton的假设,singelton的结果来自于前一个案例。这太糟糕了 您可以创建特殊的Singleton,其具有resetSingleton()或setInstance()

我正在创建一个测试自动化项目,希望它能被TESTNG使用。我计划在自动化项目中使用MVC架构,并考虑创建控制器单例。因此,您想知道它的优缺点,因为它将被支持多线程的TESTNG访问/使用。

在测试自动化中,或者通常您应该避免使用单线程。 特别是在java中,通常不能为新的测试用例重置单例。 这导致了新的tets案例使用singelton的假设,singelton的结果来自于前一个案例。这太糟糕了
您可以创建特殊的Singleton,其具有resetSingleton()或setInstance()方法,这些方法仅用于测试用例。
此外,您还可以通过反射来设置Singleton。我已经完成了所有3种工艺,但是:


最好的办法是完全避免使用单粒子。

我不能具体评论测试ng,但我可以推荐这篇有趣的文档。特别是它有一个关于单身的章节。以下是一些摘录:

  • 使用全局状态的每个测试都需要在预期状态下启动,否则测试将失败。但在之前的测试中,另一个对象可能已经改变了该全局状态
  • 全局状态通常会阻止测试并行运行,这会迫使测试套件运行较慢
  • 单例强制执行自己的“单例性”最终会导致作弊:在所谓的单例上,您经常会看到诸如reset()或setForTest()之类的mutator方法,因为您需要在测试期间更改实例。如果在测试后忘记重置单例,以后的使用将使用过时的底层实例,并且可能会以难以调试的方式失败
底线:如果可以的话,避免使用单例,而是使用依赖项注入。换句话说,不是:

public void someMethod() {
   Controller c = Controller.getInstance();
   c.doSomething();
}
赞成:

public void someMethod(Controller c) {
   c.doSomething();
}

共享PDF是一个真正的指南!!