单元测试复杂交互的正确方法

2024-03-22

我必须开始使用 QualityTools.UnitTestFramework 为我们开发的 Web 服务层编写一些单元测试,而我的方法从一开始似乎就不正确。

单元测试似乎应该能够以任何顺序运行,而不依赖于其他测试。

我最初的想法是拥有类似于以下测试(简化示例)的东西,它将以相同的顺序作为有序测试运行。

添加对象1成功测试
AddObject2WithSameUniqueCodeTest
(依赖于首先创建 object1 的第一个测试,然后预计会失败)
添加对象2成功测试
UpdateObject2WithSameUniqueCodeTest
(依赖于第一个测试创建了对象 1,第三个测试首先创建了对象2,然后预计会失败)
更新对象2成功测试
获取对象列表测试
删除对象测试
(使用添加的 ID)

然而,测试之间没有状态,也没有明显的方式来传递(例如添加 ID 到删除测试)。

那么,单元测试复杂交互的正确方法是按场景进行吗?

例如

添加对象成功测试
(它创建一个对象,获取它来验证数据,然后删除它)
添加具有相同唯一代码测试的对象
(它创建对象 1,然后尝试创建对象 2,但失败,然后删除对象 1)
使用相同唯一代码测试更新对象
(它创建对象 1,然后创建对象 2,然后尝试更新对象 2,使其具有与对象 1 相同的唯一代码,但失败,然后删除对象 1 和对象 2)

我是不是来错了?

Thanks


单元测试的一个原则是每个测试用例应该独立于任何其他测试用例。 MSTest(以及所有其他单元测试框架)通过不保证测试运行的顺序来强制执行这一点 - 有些(xUnit.NET)甚至甚至随机化每个测试运行之间的顺序。

将单元压缩为简单的交互也是推荐的最佳实践。虽然不能提供硬性规定,但如果交互过于复杂,就不是单元测试。无论如何,复杂的测试都很脆弱,并且维护开销非常高,这就是为什么简单的测试是首选的原因。

听起来您的测试之间有共享状态的情况。这会导致相互依赖的测试,应该避免。相反,您可以编写可重用的代码来为每个测试设置前置条件状态,确保该状态始终正确。

这样的前置条件状态称为Fixture。这本书xUnit 测试模式 https://rads.stackoverflow.com/amzn/click/com/0131495054包含有关如何在许多不同场景中管理灯具的大量信息和指南。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试复杂交互的正确方法 的相关文章

  • 如何通过 mat-dialog-close 或其他方式对 MatDialog 是否关闭进行单元测试

    我有一个简单的组件 它将显示为对话框窗口垫对话框 https material angular io components dialog overview 在该组件的模板中 一个按钮标记为垫子对话框关闭 https material ang
  • 如何在单元测试中的请求之间更改 $httpBackend when[method] 语句?

    在我的测试中 我启动一些模型数据并模拟响应 beforeEach function var re new RegExp http users online httpBackend whenGET re respond id 12345 us
  • 这可以用 Moq 来嘲笑吗?

    我正在努力模拟一些外部依赖项 并且在一个第三方类中遇到了麻烦 该类在其构造函数中接收另一个第三方类的实例 希望 SO 社区能给我一些指导 我想创建一个模拟实例SomeRelatedLibraryClass它的构造函数接受一个模拟实例Some
  • 为实体框架中的实体创建基类

    我想创建一个对我的所有实体都通用的基类 该类将具有 Save Delete GetByID 等方法以及其他一些基本功能和属性 我在 Linq to SQL 方面有更多经验 希望能在 EF 中获得一些类似的好示例 谢谢 像这样 public
  • 如何将Sinon添加到Angular 2测试中?

    我想添加Sinon进行测试 但无法让它运行 我已经安装了 sinon 和 karma sinon 作为 DevDependency 将 sinon 添加到我的 karma 配置文件中的框架中 frameworks jasmine brows
  • 如何在要测试的 React 组件内模拟自定义钩子?

    如果您有一个调用获取数据的自定义挂钩的 React 组件 那么在测试 React 组件时模拟内部自定义挂钩结果的最佳方法是什么 我看到两种主要方法 1 Jest mock 自定义钩子 这似乎是最推荐的方法 但它似乎要求测试对内部实现细节以及
  • 如何仅在特定错误退出值(0 除外)上将 Jenkins 构建标记为成功?

    当我运行Execute shell构建步骤来执行脚本并且该脚本返回0 Jenkins将构建标记为SUCCESS 否则它将其标记为FAILURE这是预期的默认行为0表示没有错误 任何其他值表示有错误 有没有办法将构建标记为SUCCESS仅当返
  • AngularJS 和 PouchDB 服务的单元测试

    我正在尝试对我的个人 Angular 工厂进行单元测试 但很难尝试正确模拟和注入 PouchDB 对象 我的工厂代码目前如下 factory Track function var db new PouchDB tracks var reso
  • 如何从 Visual Studio 以调试模式运行 NUnit?

    我最近正在为我一直在研究的一些 C 构建一个测试框架 我在工作区中设置了 NUnit 和一个新项目来测试该组件 如果我从 Nunit v2 4 加载单元测试 一切都会很好 但我已经到了在调试模式下运行并设置一些断点非常有用的地步 我已经尝试
  • 模拟类:Mock() 还是 patch()?

    我在用mock http www voidspace org uk python mock index html使用Python 想知道这两种方法中哪一种更好 阅读 更Pythonic 方法一 只需创建一个模拟对象并使用它 代码如下 def
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • C# .NET 4.0 测试框架?

    如果我没记错的话 NUnit 是单元测试事实上的标准 但我刚刚下载了它 编写了一个简单的测试 然后显然我必须启动 GUI 并加载我的 exe组装 根本就失败了 我尝试编辑 C Program Files x86 NUnit 2 5 7 bi
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 带完整堆栈跟踪的单元测试

    这似乎是一个愚蠢的问题 但我无法在任何地方找到答案 我正在使用 Rails 3 1 和 Test Unit 当测试失败时 我只能看到堆栈的顶部 例如 ERROR creating a message sends emails 1 35s N
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • 如何使用 jest 测试 unhandledRejection / uncaughtException 处理程序

    我有处理程序unhandledRejections and uncaughtExceptions bin js unhandledRejection uncaughtException forEach event gt process on
  • 0xc000007b“应用程序无法正确启动”错误?

    我在 Visual Studio 2019 中编写了一个 C 控制台应用程序 并尝试将其部署到另一台 Windows 笔记本电脑 两台笔记本电脑均运行最新的 64 位 Windows 10 我的目标笔记本电脑已安装 最新的 NET Fram
  • 从单元测试调用时,Application.Current 为 null

    我有一个尝试从单元测试中调用的方法 该方法在现实生活中将从后台线程运行 它使用一些代码来启动 UI 线程的调用更新 使用Application Current Dispatcher BeginInvoke However Applicati
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • RSpec 与 Shoulda?

    我是单元测试场景的新手 我现在只使用单元测试大约两个月了 当我在 Ruby 中进行单元测试时 我目前遵循 TDD 风格并使用 Test Unit TestCase 我还阅读了 RSpec 以及它如何遵循 BDD 方法 我还读过关于 Shou

随机推荐

  • ExpressJS:承诺和错误处理中间件

    我定义了一些错误处理中间件和返回承诺的路由 但是当这个承诺出现错误时 我必须手动附加 catch err gt next err 在每一个承诺之后 虽然这不是问题 但对于 ExpressJs 来说 查看路由是否返回 Promise 如果返回
  • 快速使函数中的计时器无效

    我正在尝试创建一个带有主比赛时钟和开始 停止按钮的曲棍球比赛时钟应用程序 但我的 stopGameclock 函数遇到了问题 计时器不会失效 通过在这里搜索其他问题 我认为这与我有关 var gameclockTimer NSTimer 接
  • NSArray 和 NSMutableArray 的区别

    黑白有什么区别NSArray and NSMutableArray NSMutableArray 以及所有其他类Mutable名称中 可以修改 所以 如果你创建一个普通的NSArray 您以后无法更改其内容 无需重新创建它 但如果你创建一个
  • IdentityServer4 PKCE 错误:“转换后的代码验证程序与代码质询不匹配”

    我无法获得使用 Postman 工作的 IdentityServer4 PKCE 授权 使用在线工具我创建了必要的部分 选择一个随机字符串 1234567890 获取其 SHA 256 哈希值 c775e7b757ede630cd0aa11
  • Safari 中存在块作用域变量的 bug?

    我正在测试是否可以使用块作用域来替换 IIFE 以通过闭包创建 私有 变量 在 Safari 11 0 3 11604 5 6 1 1 中进行测试之前一切进展顺利 该版本支持块作用域 但存在块和闭包的错误 例如 let i 0 functi
  • ConcurrentDictionary 陷阱 - GetOrAdd 和 AddOrUpdate 的委托工厂是否同步?

    的文档ConcurrentDictionary没有明确说明 所以我想我们不能指望代表valueFactory and updateValueFactory让它们的执行同步 分别来自 GetOrAdd 和 AddOrUpdate 操作 所以
  • 在文件中每行的开头和结尾添加字符

    在每行的开头和结尾添加一些字符的最佳方法是什么 可以使用 Vim 或其他方式完成吗 在vim中 你可以这样做 s 1 s regex replace 是用于搜索和替换的 vim 命令 使其适用于整个文件 and 分别表示行的开始和结束 捕捉
  • 在摩卡测试之间重新导入模块

    在我的节点 打字稿快递应用程序中 我将配置设置存储在settings json作为对象加载和导出的文件config ts 每个使用配置设置的模块都会像这样导入模块 import Config from config config ts看起来
  • 如何使用 C# 验证文件是否是受密码保护的 ZIP 文件

    给定文件路径 如何验证该文件是否是受密码保护的 zip 文件 即 我将如何实现这个功能 bool IsPasswordProtectedZipFile string pathToFile 我不需要解压缩该文件 我只需要验证它是否是 ZIP
  • 可拖动的CALayer

    有什么方法可以让用户拖动 CALayer 吗 如果是这样 怎么办 在可可 Mac 中 图层本身无法接收鼠标事件 您必须在包含该层的视图或视图控制器中进行事件处理 If a mouseDragged 事件起源于某个层 请参见 CALayer
  • 在C++中使用const成员变量有什么优点

    我写代码像 template
  • python-re:如何匹配字母字符

    如何将字母字符与正则表达式匹配 我想要一个角色 w但不在 d 我希望它与 unicode 兼容 这就是为什么我不能使用 a zA Z 你的前两句话互相矛盾 在 w但不在 d 包括下划线 我从你的第三句话假设你不需要下划线 在信封背面使用维恩
  • iOS:用于登录屏幕的表格样式文本字段?

    我想制作一个像 Facebook 应用程序那样的登录屏幕 我想要复制的部分是两个文本字段 它们堆叠起来看起来像一个表格组 但我不明白他们是怎么做到的 谁知道其中的窍门 我无法发布图片 因为我是 stackoverflow 的新手 这是一种效
  • PHP 图片大小小于 1mb

    目前我正在使用以下内容来计算文件大小是否小于 1MB 但是由于以下代码来自 9lession 示例站点 它说要检查 1mb 的大小 但如果我乘以 1024 2 这就是他们在这里所做的不等于 1mb 而是 2048kb 说它上传的大小不是以
  • 如何在 macOS 上的 SwiftUI 中检测键盘事件?

    如何在 macOS 上的 SwiftUI 视图中检测键盘事件 我希望能够使用击键来控制特定屏幕上的项目 但不清楚如何检测键盘事件 这通常是通过覆盖keyDown event NSEvent in NSView 与 Xcode 12 捆绑在一
  • 将正则表达式匹配到第一个空格

    我必须填充商店的图像 并提供以下格式的图像文件夹 例如BRL0368 Side jpg 5510 Dura Guard Carpet jpg 现在我想做的就是把所有这些都砍掉 这样我就可以尝试在 Excel 中匹配零件编号 例如 BRL03
  • Func 的性能和继承

    我一直无法理解使用的性能特征Func lt gt 在我的代码中 当使用继承和泛型时 我发现自己一直在使用继承和泛型的组合 让我从一个最小的测试用例开始 这样我们都知道我们在说什么 然后我将发布结果 然后我将解释我的期望和原因 最小测试用例
  • AWS python lambda函数:没有名为请求的模块

    我对 AWS 还很陌生 遇到了一些问题 这是我的代码 from future import print function from urllib2 import Request urlopen URLError import request
  • 多索引 pandas 更新

    有两个数据帧 df1 和 df2 import pandas as pd import numpy as np import datetime A list range 3 9 B datetime date 2019 1 1 dateti
  • 单元测试复杂交互的正确方法

    我必须开始使用 QualityTools UnitTestFramework 为我们开发的 Web 服务层编写一些单元测试 而我的方法从一开始似乎就不正确 单元测试似乎应该能够以任何顺序运行 而不依赖于其他测试 我最初的想法是拥有类似于以下