.net NUnit与手动单元测试

.net NUnit与手动单元测试,.net,nunit,.net,Nunit,背景 我最近尝试开发一套测试,用于特定应用程序的回归测试。我一直在使用NUnit,没有任何问题 我遇到了向NUnit测试发送参数的问题,似乎没有令人满意的答案 问题 假设我实现了一个简单的单元测试程序,它加载一个类,依次运行Startup、Test和Teardown方法,捕获异常,然后卸载程序集。与使用NUnit相比,这样做的缺点是什么 在这个场景中,我可以轻松地将参数传递给我的测试用例,或者做我可能想到的任何其他疯狂的事情。但我担心的是,放弃NUnit会让我失去什么。你会失去什么?你的时间 如

背景

我最近尝试开发一套测试,用于特定应用程序的回归测试。我一直在使用NUnit,没有任何问题

我遇到了向NUnit测试发送参数的问题,似乎没有令人满意的答案

问题

假设我实现了一个简单的单元测试程序,它加载一个类,依次运行Startup、Test和Teardown方法,捕获异常,然后卸载程序集。与使用NUnit相比,这样做的缺点是什么


在这个场景中,我可以轻松地将参数传递给我的测试用例,或者做我可能想到的任何其他疯狂的事情。但我担心的是,放弃NUnit会让我失去什么。

你会失去什么?你的时间

如果您为客户或企业工作,他们(可能)付钱给您是为了解决业务问题,而不是为了编写基础架构代码。为了满足业务需求,可能需要一些基础设施。在这种情况下,显然不是。你在重新发明轮子

不要落入“不在这里发明”的陷阱。使用NUnit。它支持。如果它不能满足你的需要,调查一下。或者看一下BDD样式等。或用于验收测试。这只是一个部分列表

如果您是为了学习目的自己编写测试框架,那就太好了!如果不是,你是在浪费你的时间和/或你公司的钱

解决技术问题

JUnit最初是在。当时没有太多的选择。编写测试框架不是一个庞大的项目。编写一个功能齐全且易于使用的健壮的应用程序更加困难。编写测试运行程序、IDE集成、CI集成、代码覆盖率集成等要困难得多。而且已经完成了。除非你是Ayende Rahien,否则别这么做

除了集成之外,您还失去了任何未实现的功能(还有很多)。我不使用所有这些,但我确实依赖其中许多


(从我的评论中移动)

这一问题的两个部分主要是独立的部分:

  • 创建我们自己的实现有哪些优点/缺点
  • 为什么这个用例甚至没有理由玩弄创建我们自己的想法 实施

1) 因为这属于“车轮的重新发明”,所有的赞成/反对意见都是相同的,并且比这个问题更一般,所有这些推理都适用于这个案例

  • 我们不使用现有的稳定实现
  • 我们可能低估了在现有实现中投入的工作时间
  • 我们失去了围绕现有实现构建的所有周边生态系统
  • 我们失去了共同积累的社区知识
  • 我们可能无法在可接受的时间范围内达到要求的最低质量预期
(在20世纪90年代,我遇到一个家伙,他在写RDBMS,因为Oracle数据库和SQL Server 6.5都“无法”完成他想做的事情……顺便说一句,这是一个可分页的光标)

2) 向NUnit测试发送参数与任何其他配置/参数设置任务一样。您可以从您选择的格式(比如:XML、json、RDBMS)中读取配置/参数,并在setup、teardown和“test”方法中执行此操作

您可以创建您的

  • a) 完全定制的实现(我的意思是在 设置、测试和拆卸)
  • b) 或者您可以依赖
    [TestCaseSource]
    或 相关属性
  • c) 或者扩展NUnit

为什么需要将参数传递给单元测试?听起来您正在测试的不仅仅是一个单元……这些测试是远程执行的,并且需要关于谁执行这些测试的信息,以便进行日志记录。这是一个有效的问题,但不幸的是,不是我在这里要问的。@nathangonzalez根据您正在测试的内容,您可能希望使用稍微不同的数据多次运行同一测试。“参数化测试可以很容易地做到这一点,而无需多次重复本质上相同的测试。”nathangonzalez同意,当涉及到为两个目的重用相同的测试时。我想到的测试具有相同的目的,但需要不同的数据。例如,通常会导致同一测试的多次执行(数字X转换为字母Y),参数化测试可以提高可读性并减少容易出错的重复。(注意:NUnit将参数化测试作为每个输入的单独测试来运行,这与编写单独的测试非常相似。)这就是我想到的东西。对于参数化测试,您有两个选项:通过属性提供参数,或者使用属性指定另一个将生成所有参数的方法。这使您既具有可读性又具有高级功能,并且仍然使用NUnit。从生产力的角度来看,答案非常有趣,尽管我仍然对问题的技术方面感兴趣。您所说的“问题的技术方面”是什么意思?这个答案不是在斯坦斯工厂吗?