依赖 NUnit 单元测试的顺序是否是一种不好的形式

2024-01-11

我一直在疯狂地创建单元测试,并发现我经常不得不在一个测试中设置一些我刚刚在上一个测试中拆除的东西。在一次测试(例如插入测试)中创建某些内容(例如数据库记录)然后将其用于以后的测试(例如删除测试)是否合理?或者每个测试都应该完全独立吗?

您甚至可以确定 NUnit 中测试的顺序还是它们总是按字母顺序完成?

注意:我特别询问内部测试的顺序one测试文件。Not跨测试文件或以任何更全局的方式。

Update:感谢所有回答的人 - 有一个lot好的答案和小组的感觉非常一致。我选择了约翰·诺兰的答案,因为他提供了最完整的解释和大量链接。正如您可能已经猜到的那样,尽管我认为它可能像约翰所说的那样有点“臭”,但我还是很想打破这条规则。也感谢 Fortyrunner 添加单元测试 tag.


依赖测试的顺序表明您正在跨测试保持状态。这是smelly http://en.wikipedia.org/wiki/Code_smell

一种更简洁的测试方法是仅依赖于要检查其行为的单个功能。通常你mock http://en.wikipedia.org/wiki/Mock_object使被测方法正常运行所需的其他对象。

考虑进行单元测试的一个好方法是安排、行动、断言 http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/24/arrange-act-assert-and-bdd-specifications.aspx图案。

以下是 Karl Seguin 的优秀免费作品的片段eBook http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx。我已经注释了 Arrange、Act 和 Assert。

[TestFixture] public class CarTest 
{ 
    [Test] public void SaveCarCallsUpdateWhenAlreadyExistingCar()   
    {
         //Arrange
         MockRepository mocks = new MockRepository();
         IDataAccess dataAccess = mocks.CreateMock<IDataAccess>();   
         ObjectFactory.InjectStub(typeof(IDataAccess), dataAccess); 
         //Act
         Car car = new Car(); 
         Expect.Call(dataAccess.Save(car)).Return(389); 
         mocks.ReplayAll(); 
         car.Save(); 
         mocks.VerifyAll(); 
         // Assert
         Assert.AreEqual(389, car.Id); 
         ObjectFactory.ResetDefaults();
    } 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖 NUnit 单元测试的顺序是否是一种不好的形式 的相关文章

随机推荐

  • 在 iPad 版 SDK 3.2 中使用 MPMoviePlayerViewController

    我开发了一个 iPhone 应用程序 它运行 MPMoviePlayer 3 2 SDK 之前的版本 没有任何问题 我知道这是一个新手问题 但如何让电影在新的 MPMoviePlayerViewController 中播放 我只收到音频并希
  • 的开始/结束外观转换的调用不平衡

    当我模拟我的应用程序时 我遇到了这个问题 它不是错误或警告 但它出现在我的控制台中 以前有人遇到过这种情况吗 就我而言 当您非常快速地单击表格视图中的两个选项卡时 就会发生此错误 结果导致标题名称错误 后退按钮消失 有人提到 当你推送视图时
  • 让 ASP.MVC2/VS2010 应用程序在 IIS 7.5 中工作

    我最近下载了 VS2010 beta 2 并开始使用 ASP NET MVC2 最初的开发是使用 Casini 完成的 但现在我想从 IIS 7 5 运行该应用程序 我运行的是 Windows 7 我已经安装了 IIS6 元数据库兼容性 并
  • 使用 Python 通过 Binance API 进行交易时出现问题

    我试图在不使用外部库的情况下在美国版 Binance API 上进行交易 我可以使用 GET 请求成功获取价格并显示我的帐户余额urllib 第一个示例代码有效 我可以通过我的API KEY and SECRET KEY没有问题 这些值是私
  • 我什么时候应该关心 std::iostream::sentry?

    网上参考资料对目的的描述相当简短和模糊std iostream sentry 我什么时候应该关心这个小动物 如果只是为了内部使用 为什么要公开呢 每当您需要使用流提取或输出数据时 都会使用它 也就是说 每当你创建一个operator gt
  • 如何在 JavaFX 中设置选项卡名称大小

    我有这个简单的选项卡示例 primaryStage setTitle Tabs Test Group root new Group Scene scene new Scene root 600 500 Color WHITE TabPane
  • 如何在servlet中使用依赖注入?

    如何将对象注入到 servlet 中 我的意思是 我不能使用构造函数 DI 因为 servlet 是由 servlet 容器实例化的 而且我也没有看到为 servlet 实现基于 setter 的 DI 的好方法 我应该使用 servlet
  • RecyclerView 不会立即显示插入的 SQLite 数据

    当用户从FragmentDialog将他的数据输入编辑文本并按保存按钮 数据应立即显示在recyclerView 但这并没有发生 要获取 显示最新数据 您必须重新启动应用程序 我使用了一个临时解决方案 我从FragmentDialog to
  • Android 模拟器启动失败。 emulator64-arm:可执行文件中的 CPU 类型错误

    昨天我决定开始在我的 mac Snow Leopard 10 6 8 32 位上开发 Android 一切都很好 我还导入了我在 Linux 中工作了几个月的工作空间 我打开一个项目并完美编译 当我尝试运行该项目时 它给了我这个错误 and
  • 使用 .NET 的 XSLT 小写

    我通过使用 XMLSpy 使用以下 XSLT
  • 在 Python 中迭代少量项目的最佳样式?

    我刚刚读了一篇关于 python 的演示文稿 我注意到作者错过了要迭代的元组的圆括号 我突然意识到我可能倾向于将它们留在里面 快速重读PEP 8 http www python org dev peps pep 0008 没有给出明确的答案
  • 分享 Nginx 服务器配置

    我如何在两台服务器之间共享通用配置 我的应用程序支持 http 和 https 几页 我目前正在使用 fastcgi param 来保存数据库名称和密码等敏感信息 我如何共享两个服务器 80 443 的位置和fastcgi param se
  • MVC :: 什么是模型?

    我现在必须对模型做出决定 我知道模型是您用来进行所有数据库操作的工具 但模型仅限于此吗 它们仅用于数据库交互还是用于所有外部数据操作 例如来自外部 API 的数据等 MVC 范例是一种设计模式 您可以使用以下结构来组织应用程序 模型 这是您
  • 在 kusto 查询中解析 json

    如何使用 KUSTO 查询从 JSON 中提取单个值 我希望能够读取 SourceSystemId Message 的值并投影这些值 我还想使用以下 JSON 中的日期作为过滤器 并且仅投影那些日期大于作为外部参数提供的日期的记录 Stat
  • SBT 凭证配置应该放在哪里?

    我在 Windows 上运行 SBT 1 1 1 如果我将以下行放入我的 build sbt 中 我的构建就可以了 credentials Credentials Path userHome sbt credentials 问题是 我并不是
  • 当用户缩小浏览器窗口时,如何使 2 个或更多水平 div 堆叠成一个垂直 div?

    我在同一行有 2 个 div 每个 div 的宽度为 50 并且有一个 float left 如果用户通过智能手机查看页面 我希望它们将一个堆叠在另一个之上 现在 即使浏览器窗口缩小到 300 像素或从智能手机查看 div 仍保留在同一行
  • 如何重定向到自定义 URI 方案,或在不支持的情况下显示一些内容?

    简而言之 是否可以将访问者重定向到自定义 URI 方案 或者在不支持该方案的情况下显示一些内容 我的具体用例是 我正在创建一个注册自定义 URI 方案的移动应用程序 以便用户可以通过短信或电子邮件发送链接来邀请其他用户执行应用程序内的某些操
  • Rails 简单形式给出 InvalidAuthenticityToken 错误

    我有一个像这样的简单表格
  • 为什么java tzupdater要添加闰秒?

    有一些参考文献提到 Java 忽略闰秒 考虑到新引入的闰秒 1 年前的 java lib 如何正确执行 UTC 时间格式 https stackoverflow com questions 21782785 how can a 1 year
  • 依赖 NUnit 单元测试的顺序是否是一种不好的形式

    我一直在疯狂地创建单元测试 并发现我经常不得不在一个测试中设置一些我刚刚在上一个测试中拆除的东西 在一次测试 例如插入测试 中创建某些内容 例如数据库记录 然后将其用于以后的测试 例如删除测试 是否合理 或者每个测试都应该完全独立吗 您甚至