如何(策略)以 BDD 风格对属性(获取/设置)进行单元测试?

2024-03-18

我有一个(很多)类具有属性。有些有逻辑,有些则没有。假设我想测试这些属性,我该怎么做呢?

最近,我对用于创建单元测试的 BDD 风格很感兴趣。

see here http://iridescence.no/post/Extending-xUnit-with-a-Custom-ObservationAttribute-for-BDD-Style-Testing.aspx and here http://www.bjoernrochel.de/tag/xunitbddextensions/.

所以我会设置上下文 - 基本上创建 SUT 并加载所需的任何内容。 然后在每个观察(测试方法)中,我将验证特定属性是否包含它应该包含的内容。

这是我的问题。如果 SUT 有 20 个属性,那么我是否要创建 20 个观察/测试?我猜如果其中一个属性包含更有趣的逻辑,可能会更多。

[Observation]
public void should_load_FirstName()
{
    Assert.Equals<string>("John", SUT.FirstName);
}

[Observation]
public void should_load_LastName()
{
    Assert.Equals<string>("Doe", SUT.LastName);
}

[Observation]
public void should_load_FullName()
{
    Assert.Equals<string>("John Doe", SUT.FullName);
}

但如果将简单的观察结果汇总到一次观察中会更好吗?

[Observation]
public void should_load_properties()
{
    Assert.Equals<string>("John", SUT.FirstName);
    Assert.Equals<string>("Doe", SUT.LastName);
    Assert.Equals<string>("John Doe", SUT.FullName);
}

或者,如果我使用自定义属性(可以多次应用于一个方法)怎么办?这样我就可以做类似的事情:

[Observation(PropertyName="FirstName", PropertyValue="John")]
[Observation(PropertyName="LastName", PropertyValue="Doe")]
[Observation(PropertyName="FullName", PropertyValue="John Doe")]
public void should_load_properties()
{
}

一般来说,你应该努力只拥有一个logical每个测试的断言。优秀的书xUnit 测试模式 https://rads.stackoverflow.com/amzn/click/com/0131495054对此进行了很好的讨论,但重点是,如果测试失败的原因只有一个,那么可以更轻松地理解违规发生的位置。不过,这可能比 BDD 更适合回归测试......

所有这些都意味着您选择编写一个验证所有属性的单个测试可能是最没有吸引力的,尽管您could认为验证所有属性是一个单一的逻辑断言......

xDD(TDD、BDD,等等)的一个更核心的原则是测试应该充当可执行的规范。换句话说,当您不仅查看测试时,它应该立即显而易见what正在测试中,而且还why预期值就是这样。在您的示例中,不清楚为什么 SUT.FirstName 应该是“John”而不是“Jane”。

如果可能的话,我会编写这些测试来使用派生值 http://blog.ploeh.dk/2009/03/03/DerivedValuesEnsureExecutableSpecification.aspx而不是硬编码值。

对于可写属性,我经常编写测试来简单地验证 getter 返回分配给 setter 的值。

对于只读属性,我经常编写测试来验证该值是否与构造函数参数匹配。

此类测试可以封装到可重用的测试代码中,该代码封装了常见的测试习惯。我目前正在研究一个可以做到这一点的图书馆 http://autofixture.codeplex.com/WorkItem/View.aspx?WorkItemId=1650.

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

如何(策略)以 BDD 风格对属性(获取/设置)进行单元测试? 的相关文章

  • Rails:如何测试 lib/ 目录中的代码?

    我有一个从解析器对象获取数据的模型 我认为解析器类应该位于 lib 目录中 尽管我可以说服它应该位于其他地方 问题是 解析器类的单元测试应该在哪里 如何确保每次运行 rake 测试时都运行它们 在我正在开发的 Rails 应用程序中 我决定
  • 如何将 JUnit 5 与 Gradle 结合使用?

    在成功运行 JUnit 4 测试后 我尝试将 JUnit 5 与 Gradle 一起使用 预期结果 JUnit 4 测试在输出中给出了很好的 通过 结果 并在build reports tests 实际结果 下面的 JUnit 5 测试不输
  • 测试驱动开发 - 我应该测试数据库列和索引吗?

    我是 TDD 新手 我发现shouldagem 能够测试数据库实体的列是否存在以及测试其索引 但是否有必要在我的测试套件中包含列和索引的测试 我是否需要担心在开发过程中可能会删除任何列和索引 不要测试数据库列 这只是测试实施 不要测试实现
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • 设置具有不同输入的测试方法

    我想在 C 中测试所有代码路径的以下方法 public int foo int x if x 1 return 1 if x 2 return 2 else return 0 我见过这个pex单元测试 http fernandomachad
  • 如何从 OpenCover 报告中排除类别

    在使用 OpenCover 为 MSTest 套件生成覆盖率报告 然后使用 ReportGenerator 生成 HTML 报告 时 我尝试排除框架生成的类 特别是 通过服务引用在项目的命名空间下生成的类 我用来生成 XML 文件的命令如下
  • 无法在 SBT 中运行 Apache Spark 相关单元测试 - NoClassDefFoundError

    我有一个简单的单元测试 使用SparkContext 我可以在 IntelliJ Idea 中运行单元测试 没有任何问题 但是 当尝试从 SBT shell 运行相同的测试时 我收到以下错误 java lang NoClassDefFoun
  • PyQt 和 unittest - 测试信号和槽

    我有一个 pyqt 应用程序 正在为其编写单元测试 它严重依赖信号和槽 为了正确测试它 我必须检查是否发送了正确的信号 做这个的最好方式是什么 我看到 Qt 库有一个 QSignalSpy 但我在 PyQt 中找不到任何对此的引用 我能想到
  • 使用MockWebServer暂停功能测试

    我正在测试使用 MockWebServer 的挂起函数返回结果的 api 但它不适用于 runBlockingTest testCoroutineDispatcher testCorounieScope 除非launch使用builder
  • xCode 7.1 中警报的 UITesting

    我正在 xCode 7 1 中编写 UITests 并且在测试警报时遇到问题 在我的情况下允许通知 创建测试时 xCode 会写入以下代码 app alerts U201cAppName U201d Would Like to Send Y
  • Django:出于测试目的阻止互联网连接

    我想确保我的单元测试不会尝试连接到互联网 有没有办法在连接时引发异常 有一个类似的问题Python 出于测试目的阻止网络连接 https stackoverflow com questions 18601828 python block n
  • 如何在单元测试中比较列表

    这个测试怎么会失败呢 TestMethod public void Get Code var expected new List
  • C# 模拟接口与模拟类

    我是 net 中的最小起订量框架的新手 根据我的在线研究 似乎有两种方法可以使用这个框架 要么模拟接口 要么模拟具体类 似乎在嘲笑具体类时 只有virtual方法可以被嘲笑 就我而言 我只想模拟实现接口的类的几个方法 例如 如果我们有以下内
  • 是否可以存根实体框架上下文和类来测试数据访问层?

    我熟悉用于测试 ASP NET MVC 应用程序中的控制器和业务逻辑的技术 我们的应用程序中的数据访问集中在松散耦合的特殊服务中 使用接口并通过实体框架与实际数据库一起使用 然而 随着 DAL 变得越来越复杂 隐藏数据库实现细节并为应用程序
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 使用文件 IO 的单元测试方法

    我正在努力养成编写单元测试的习惯 我之前写过一些 但它们通常都很基础 我想开始转向 TDD 因为我想提高质量我的代码 设计和结构 减少耦合 同时希望减少可测试构建的回归数量 我从一个相对简单的项目开始 生成的程序监视一个文件夹 然后对该文件
  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • 使用内联查询进行单元测试

    我知道有几个问题与我的类似 Dapper 单元测试 SQL 查询 https stackoverflow com questions 20461553 dapper unit testing sql queries 测试简洁的查询 http
  • 我的单元测试 ReSharper 装订线图标未显示

    我已经安装了 ReSharper 4 1 和 Gallio 3 0 5 但没有获得单元测试的装订线图标 测试似乎在测试资源管理器中运行良好 但代码中的测试旁边没有图标 可能是什么原因造成的 我之前安装了 MbUnit 2 4 ReSharp
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp

随机推荐

  • 从 Qt Creator 附加到 Android 进程

    我使用Qt Creator开发Android动态库 即 so文件 然后 该 so 文件将由 Android 应用程序使用 但该应用程序是在 Eclipse 中开发的 我需要调试我的本机代码 但由于它是一个库 我无法从 Qt Creator
  • Android -> 获取 Android 10 及以下版本的当前网络类型

    如何获取当前网络类型 我找到了解决方案 val info connectivityManager activeNetworkInfo if info null info isConnected return not connected if
  • 配置 log4j 时 Log4jConfigListener 和 Log4jServletContextListener 之间的区别

    我正在尝试使用 log4j 日志记录在 tomcat 中部署 spring web 应用程序 根据我通过阅读 log4j 配置看到的内容 您可以按如下方式执行此操作
  • 查询按字段中最后一个字符选择组

    我正在尝试对表进行查询搜索并返回以相同字符结尾的行数 例如 Cd312a fdhEA 和 42dA 将一起分组在 A 下 下面是表格的示例以及我希望看到的返回内容 表Tbl Table ID Name 1 S033114A 2 S03311
  • 通过 DriveApp.getFileById 从 Google Drive 到 Google Slides 的图像

    我想在按照说明后通过 Google Apps 脚本将图像导入到 Google 幻灯片Google 开发者 如何 https developers google com slides how tos add image about image
  • 计数聚合点计数语法 (.count)

    所以今天早上我遇到了一个奇怪的错误 当时我不小心提到了 CTE 中不存在的 计数 列 Postgres 正在寻找 GROUP BY 子句 尽管我不认为我在做聚合 再多尝试一下 就会发现 table count 相当于计数星函数 考虑以下 S
  • 参数变化:固定,但运行的种子不同

    所以我用许多概率参数进行了参数变化实验 我使用随机种子 这会产生各种不同的结果 这基本上就是我想要的 在我的例子中 一项实验包含 200 次运行 然而 在随机建模中 在相同的运行中使用相同的种子是一个很好的做法 即当我运行两个实验 每个实验
  • Rails:用户在使用 :remote => true 销毁不相关的对象后注销

    我正在跟进http railscasts com episodes 250 authentication from scratch http railscasts com episodes 250 authentication from s
  • MATLAB - 音频信号的音高变换

    我的小组正在开发一个简单的 MATLAB 图形用户界面 GUI 该界面旨在记录来自插入或内置于计算机的麦克风的音频并回放信号 到目前为止我们已经完成了 我们的 GUI 还可以加载示例 wav 文件等 并使用 GUI 上的相同 播放 按钮进行
  • Django:values_list()连接多个字段

    我有一个Person模型 我正在使用 django 表单来编辑另一个带有外键的对象Person 人物模型有first name and last name字段 我想运行一种方法来过滤外部引用下拉框的结果 我正在尝试使用values list
  • 我是否可以享受父子关系带来的好处,而无需承担数据存储争用的成本?

    假设 1 Google AppEngine 有实体组的概念 2 实体组中的实体形成一棵树 然而 据我了解 对该树中任何实体的每次 put 都会锁定整个树 而不仅仅是直接父级 一段时间 3 允许用户写ca 每秒5次到树上 4 无法实现非锁定行
  • Flask RESTful POST JSON 失败

    我在通过 curl 从 cmd Windows 7 将 JSON 发布到 Flask RESTful 时遇到问题 这就是我发布的内容 curl exe i H Content Type application json H Accept a
  • Postgres 执行函数(如果存在)

    是否可以编写一个选择语句来执行函数 如果存在 SELECT COALESCE CASE WHEN EXISTS SELECT FROM pg proc WHERE proname func name THEN null ELSE false
  • 在 MySQL 中对同一个表使用子查询

    我有一张桌子叫Staff它有以下字段 idStaff Name Phone Email SupervisorId The SuervisorId is the idStaff该工作人员的主管 我想显示所有员工的列表及其基本信息 姓名 电子邮
  • Elasticsearch 一个月内特定小时的总价值

    我有一个带有字段的elasticsearch服务器 timestamp user and bytes down 除其他外 我想计算用户一个月内的 bytes down 值总计 但仅限于上午 8 点到晚上 8 点之间的时间 我可以通过以下查询
  • 如何自动加载键盘(iOS SDK)?

    非常简单的问题 我得到一个由两个文本字段组成的视图 当视图加载时 我希望键盘自动弹出并聚焦第一个字段 我怎么做 在代码中 在 IB 中 多谢 芥末 In your viewDidAppear 方法调用 yourTextField becom
  • 使用相同表单名称进行 Jquery 验证[重复]

    这个问题在这里已经有答案了 我有一个表格可以做两件事 将名字和电子邮件地址传递给 PHP 如果用户想要提交多于一组或两组数据 则单击即可动态添加一组新的姓名 电子邮件字段 由于我不确切知道每个用户可能选择提交多少组 因此我将数据以数组形式传
  • 给出分割错误的 2D 矢量

    我正在尝试使用向量创建一个二维数组 我编写了以下代码 int main vector lt vector
  • 无法在 Sitecore 项目上设置工作流程和工作流程状态属性

    我目前正在开发一个项目 需要我设置一个非常简单的 Sitecore 工作流程 在修改现有项目以使用新工作流程时 我遇到了一些困难 这就是我所做的 当内容管理员开始编辑项目时 工作流程会创建一个新版本 并在单击提交按钮时发布该项目 我将这些工
  • 如何(策略)以 BDD 风格对属性(获取/设置)进行单元测试?

    我有一个 很多 类具有属性 有些有逻辑 有些则没有 假设我想测试这些属性 我该怎么做呢 最近 我对用于创建单元测试的 BDD 风格很感兴趣 see here http iridescence no post Extending xUnit