C# 编写单元测试标准
我计划在我的团队中引入一套编写单元测试的标准。但是要包括什么呢 这两篇文章(和)已经给了我一些思考的东西 我的标准中应该涵盖的其他领域应该是如何设置测试类以及如何组织它们。例如,如果您有一个名为OrderLineProcessor的类,那么应该有一个名为OrderLineProcessorTest的测试类。如果该类上有一个名为Process()的方法,那么应该有一个名为ProcessTest的测试(可能更多的测试不同的状态) 还有什么要包括的吗 你们公司有单元测试的标准吗C# 编写单元测试标准,c#,visual-studio-2008,unit-testing,coding-style,C#,Visual Studio 2008,Unit Testing,Coding Style,我计划在我的团队中引入一套编写单元测试的标准。但是要包括什么呢 这两篇文章(和)已经给了我一些思考的东西 我的标准中应该涵盖的其他领域应该是如何设置测试类以及如何组织它们。例如,如果您有一个名为OrderLineProcessor的类,那么应该有一个名为OrderLineProcessorTest的测试类。如果该类上有一个名为Process()的方法,那么应该有一个名为ProcessTest的测试(可能更多的测试不同的状态) 还有什么要包括的吗 你们公司有单元测试的标准吗 编辑:我使用的是Vis
编辑:我使用的是Visual Studio Team System 2008,我是在C#.Net中开发的您可能应该看看“实用单元测试”系列。是C版本,但Java有另一个版本 关于你的规格,我不会过火。你有一个很好的开始-命名约定非常重要。我们还要求目录结构与原始项目匹配。覆盖范围还需要扩展到边界情况和非法值(检查异常)。这是显而易见的,但你的规范是写下它的地方,你将不可避免地在未来与不想测试通过非法值的人进行争论。但是不要让规范超过几页,否则没有人会将其用于如此依赖上下文的任务
更新:我不同意马铃薯头先生关于每个单元测试只有一个断言的观点。这在理论上听起来很好,但在实践中,它会导致大量的冗余测试,或者人们在安装和拆卸过程中做大量的工作,而这些工作本身就应该进行测试。如果您使用的是Junit系列(OCunit、SHunit等)的工具,那么测试的名称已经遵循了一些规则 对于我的测试,我使用自定义标记来收集特定页面中的文档
我发现,大多数测试约定都可以通过对所有测试使用标准基类来实现。强制测试人员重写方法,使它们都具有相同的名称
我还提倡(AAA)测试风格,因为您可以从测试中生成相当有用的文档。它还迫使你考虑由于命名方式所期望的行为。< P>你可以把另一个项目放在你的标准中,就是试着保持你的单位测试大小小。这就是实际的测试方法本身。除非您正在进行完整的集成单元测试,否则通常不需要进行大型单元测试,比如说超过100行。我会给你这么多,以防你有很多设置来进行一次测试。然而,如果你这样做了,你也许应该重构它 人们还谈论重构代码,确保人们意识到单元测试也是代码。所以重构,重构,重构 我发现我所看到的使用中最大的问题是,人们往往不认识到您希望保持单元测试的轻量级和敏捷性。毕竟,你不希望你的测试有一个单一的野兽。记住这一点,如果您有一个方法要测试,您不应该在一个单元测试中测试所有可能的路径。您应该有多个单元测试来解释通过该方法的每个可能路径
是的,如果您正确地进行了单元测试,那么平均而言,您应该比您的应用程序拥有更多的单元测试代码行。虽然这听起来需要做很多工作,但当不可避免的业务需求发生变化时,它最终会为您节省大量时间。功能齐全的IDE用户会发现,“其中一些”对以特定模式创建测试有相当详细的支持。鉴于这一类别:
public class MyService {
public String method1(){
return "";
}
public void method2(){
}
public void method3HasAlongName(){
}
}
当我在intellij IDEA中按ctrl-shift-T时,我在回答1对话框后得到了这个测试类:
public class MyServiceTest {
@Test
public void testMethod1() {
// Add your code here
}
@Test
public void testMethod2() {
// Add your code here
}
@Test
public void testMethod3HasAlongName() {
// Add your code here
}
}
因此,在编写标准之前,您可能需要仔细研究一下工具支持。看看(或者是什么让单元测试变得糟糕的单元测试)
看一看“安排、行动、断言”的概念,即一个测试只做三件事,按照固定的顺序:
- 安排测试所需的任何输入数据和处理类
- 执行测试中的操作
- 使用一个或多个断言测试结果。是的,它可以是多个断言,只要它们都用于测试所执行的操作
另外,我对今天的标准文档的看法是,除非你必须写,否则你不应该写它们——有很多可用的资源已经写好了。链接到它们,而不是重新整理它们的内容。为想了解更多信息的开发人员提供一份阅读清单。我的单元测试函数名使用了几乎通俗易懂的英语。有助于准确定义他们的工作:
TEST( TestThatVariableFooDoesNotOverflowWhenCalledRecursively )
{
/* do test */
}
我使用C++,但是命名约定可以在任何地方使用。
< P>我遵循TDD的BDD风格。见: 简言之,这意味着- 这些测试不被认为是“测试”,而是系统行为规范(以下简称“规范”)。规范的目的不是验证系统在任何情况下都能工作。他们的目的是指定行为并推动系统的设计
- spec方法名称以完整的英语句子书写。例如,球的规格可能包括“球是圆的”和“当球碰到地板时,它会反弹” <