1

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

4

2 回答 2

1

我无法具体评论 test ng,但我可以推荐这个关于编写可测试代码的有趣文档。特别是它有一个关于单例的部分。以下是一些摘录:

  • 每个使用全局状态的测试都需要它以预期的状态开始,否则测试将失败。但是另一个对象可能在之前的测试中改变了该全局状态。
  • 全局状态通常会阻止测试能够并行运行,这会迫使测试套件运行得更慢。
  • 强制执行自己的“单例”的单例最终会作弊:您经常会在所谓的单例上看到诸如 reset() 或 setForTest() 之类的突变方法,因为您需要在测试期间更改实例。如果您在测试后忘记重置 Singleton,以后的使用将使用陈旧的底层实例,并且可能会以难以调试的方式失败。

底线:如果可以,请避免使用单例,并改用依赖注入。换句话说,而不是:

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

赞成:

public void someMethod(Controller c) {
   c.doSomething();
}
于 2012-12-19T09:26:12.883 回答
1

在测试自动化中,或者通常您应该避免使用单例。尤其是在 java 中,您通常无法为新的测试用例重置单例。这导致了新的 tets 案例使用具有前一个结果的 singelton 的情况。这是不好的!
有人可能会创建特殊的单例,它们有一个 resetSingleton() 或一个 setInstance() 方法,它们只会在测试用例中使用。
此外,您可以通过反射来处理单声道。我已经完成了所有 3 种技术,但是:

最好的办法是完全避免单例。

于 2012-12-18T19:34:43.697 回答