单元测试 - 在哪里放置初始化代码?
Unit Tests - where to place initialization code?
我喜欢小的单元测试,只调用被测函数和断言。
但是我对初始化代码放在哪里感到困惑?单元测试使用了很多变量,例如 request/response 对象和其他变量。有几种方法可以初始化它们。
- 在测试本身内部初始化它们,但这会导致测试变得巨大
- 有一个包含初始化内容的 setUp() 或 initialize(),这会导致私有 class 变量的数量,但似乎比其他 2 个更好,因为所有初始化代码都在一个地方。
- 有私有方法来做到这一点,导致很多私有方法,有时 1 个测试需要 2-3 个私有方法。
任何人都可以指出哪种方法更好吗?此外,任何对这方面的一些好的文章的引用都将不胜感激。
我们可以使用 JUnit 中提供的封闭特性。使用它,我们可以将相关测试分组到 static inner class 中,并且可以为相关测试设置通用设置。如果我们有一些在所有测试中通用的变量,我们可以放入外部 class。查看 this 了解更多详情。
Have a setUp() or initialize() which has the initialization stuff, this results in number of private class variables, but seems better than other 2 since all the initialization code is in one place.
您应该将初始化代码放在使用@Before 和@BeforeClass 注释进行注释的方法中。使用此约定,其他所有开发人员都不会感到惊讶,并且会很快找到他想要的东西。请注意,这并不意味着您不应该在 JUnit 测试中创建私有方法。当您的 setup() 方法最终变大时,您可能会考虑将其按代码的逻辑部分拆分为私有方法。
我发现 this site 在简要描述 JUnit 中的良好做法时很有帮助。
以清晰整洁的方式组织测试并不容易,这在很大程度上取决于您的上下文。但有几件事你应该考虑:
- 所有测试用例通用的初始化代码应该在@Before 或@BeforeClass 方法中。特别是,您应该将后者用于计算量大的代码,例如连接到数据库。
- 特定于每个测试用例的初始化代码应该在测试用例本身中。使用模式来简化每个测试的设置,例如 ObjectMother or the Test Data Builder.
我不是特别喜欢在测试中使用私有辅助方法,尽管在某些特定情况下我发现它们很有用。但我宁愿创建一个单独的助手 class(最有可能是某种构建器),可以在其他地方重复使用。
希望对您有所帮助。
我喜欢小的单元测试,只调用被测函数和断言。
但是我对初始化代码放在哪里感到困惑?单元测试使用了很多变量,例如 request/response 对象和其他变量。有几种方法可以初始化它们。
- 在测试本身内部初始化它们,但这会导致测试变得巨大
- 有一个包含初始化内容的 setUp() 或 initialize(),这会导致私有 class 变量的数量,但似乎比其他 2 个更好,因为所有初始化代码都在一个地方。
- 有私有方法来做到这一点,导致很多私有方法,有时 1 个测试需要 2-3 个私有方法。
任何人都可以指出哪种方法更好吗?此外,任何对这方面的一些好的文章的引用都将不胜感激。
我们可以使用 JUnit 中提供的封闭特性。使用它,我们可以将相关测试分组到 static inner class 中,并且可以为相关测试设置通用设置。如果我们有一些在所有测试中通用的变量,我们可以放入外部 class。查看 this 了解更多详情。
Have a setUp() or initialize() which has the initialization stuff, this results in number of private class variables, but seems better than other 2 since all the initialization code is in one place.
您应该将初始化代码放在使用@Before 和@BeforeClass 注释进行注释的方法中。使用此约定,其他所有开发人员都不会感到惊讶,并且会很快找到他想要的东西。请注意,这并不意味着您不应该在 JUnit 测试中创建私有方法。当您的 setup() 方法最终变大时,您可能会考虑将其按代码的逻辑部分拆分为私有方法。
我发现 this site 在简要描述 JUnit 中的良好做法时很有帮助。
以清晰整洁的方式组织测试并不容易,这在很大程度上取决于您的上下文。但有几件事你应该考虑:
- 所有测试用例通用的初始化代码应该在@Before 或@BeforeClass 方法中。特别是,您应该将后者用于计算量大的代码,例如连接到数据库。
- 特定于每个测试用例的初始化代码应该在测试用例本身中。使用模式来简化每个测试的设置,例如 ObjectMother or the Test Data Builder.
我不是特别喜欢在测试中使用私有辅助方法,尽管在某些特定情况下我发现它们很有用。但我宁愿创建一个单独的助手 class(最有可能是某种构建器),可以在其他地方重复使用。
希望对您有所帮助。