每个单元测试应该测试多少?

2023-11-23

我的每个单元测试应该检查多少内容?例如我有这个测试

[TestMethod]
public void IndexReturnsAView()
{
    IActivityRepository repository = GetPopulatedRepository();
    ActivityController activityController = GetActivityController(repository);
    ActionResult result = activityController.Index();
    Assert.IsInstanceOfType(result, typeof(ViewResult));
}

并且

[TestMethod]
public void IndexReturnsAViewWithAListOfActivitiesInModelData()
{
    IActivityRepository repository = GetPopulatedRepository();
    ActivityController activityController = GetActivityController(repository);
    ViewResult result = activityController.Index() as ViewResult;
    Assert.IsInstanceOfType(result.ViewData.Model, typeof(List<Activity>));
}

显然,如果第一个测试失败,那么第二个测试也会失败,那么这两个测试是否应该组合成一个具有两个断言的测试?我的感觉是,测试越细粒度,每次测试检查越少,找到失败原因的速度就越快。然而,进行大量非常小的测试会产生开销,这可能会花费时间来运行所有测试。


我建议尽可能地分解它们。

造成这种情况的原因有很多,恕我直言,最重要的是:

  • When当您的一项测试失败时,您希望能够尽可能快速、安全地准确找出问题所在。让每种测试方法只测试一件事情是实现这一目标的最佳方法。

  • 每个测试都需要从头开始。如果您创建存储库一次,然后在 2 个或更多测试中使用它,那么您对这些测试的顺序有隐式依赖。假设 Test1 将一个项目添加到存储库但忘记删除它。 Test2 的行为现在将有所不同,并可能导致您的测试失败。唯一的例外是不可变数据。

至于你的速度问题,我不会担心。对于像这样的纯粹代码处理,.NET 是very速度很快,您将永远无法分辨出其中的差异。一旦你摆脱代码处理并进入数据库之类的事情,那么你就会感受到性能问题,但是一旦你这样做,你就会遇到如上所述的所有“干净的石板”问题,所以你可能只是必须忍受它(或者使尽可能多的数据不可变)。

祝您测试顺利。

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

每个单元测试应该测试多少? 的相关文章

  • 如何在 Visual Studio 中运行单个测试或特定文件夹中的所有测试?

    因此 我将从带有 ReSharper 的 Visual Studio 2015 迁移到 Visual Studio 2017 并尝试从我的工作流程中删除 ReSharper 我知道 CTRL R T 运行整个 TestClass 或所有测试
  • 这可以用 Moq 来嘲笑吗?

    我正在努力模拟一些外部依赖项 并且在一个第三方类中遇到了麻烦 该类在其构造函数中接收另一个第三方类的实例 希望 SO 社区能给我一些指导 我想创建一个模拟实例SomeRelatedLibraryClass它的构造函数接受一个模拟实例Some
  • 如何在 akka actor 中测试公共方法?

    我有一个 akka 演员 class MyActor extends Actor def recieve def getCount id String Int do a lot of stuff proccess id do more st
  • Protractor addMockModule 附加参数不起作用?

    这看起来非常非常简单 但我不明白为什么这个简单的代码不起作用 我正在添加一个模拟模块来在 Angular E2E 测试中模拟我的 API 后端 我正在使用量角器 1 6 0 我需要将附加参数传递给模拟模块 根据 Protractor 文档
  • 如何显示 RSpec 测试生成的 SQL 查询日志?

    我正在为我的 Rails 3 应用程序编写规范 我想测试数据库事务是否真的有效 如果能够看到我的应用程序在规范驱动下生成的 sql 查询 这将非常有帮助 有没有办法像在 Rails 控制台中一样查看查询 我正在使用 Rails 3 0 9
  • 如何仅在特定错误退出值(0 除外)上将 Jenkins 构建标记为成功?

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

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 如何使用JMeter对网站进行负载测试

    我想在 JMeter 中创建一个脚本来模拟100 位用户在 3 4 分钟内访问我们的网站 我们需要测试我们的应用程序是否可以允许 25 000 个用户 天 即每小时 1 100 个用户 为此我做了这个 Jmeter 测试 这是结果 这是图表
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • Angular2 如何对自定义验证器指令进行单元测试?

    我为输入字段编写了一个非常简单的自定义验证器 import Directive from angular core import AbstractControl NG VALIDATORS from angular forms functi
  • 模拟 DBSet,EF 模型优先

    正如标题所说 我遵循模型优先方法 所以我的模型类是自动生成的 如果我想嘲笑DBContext衍生的MyModelContainer其中包含DBSets实体类 阅读一些内容 为了进行单元测试 您需要将其更改为IDBSet 是否可以做到这一点
  • 包括 PHPUnit 在内的麻烦

    我想开始为我的代码编写测试 因此我使用以下命令安装了最新的 PHPUnit wget http pear phpunit de get phpunit phar chmod x phpunit phar mv phpunit phar us
  • C# .NET 4.0 测试框架?

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

    我正在尝试测试当通过简单的布尔值更新状态时 在父组件中其子组件是否正确呈现 在父组件下面 class Parent extends Component render const isReady this state const props
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 使用 Mockito 进行 Android 仪器测试 [重复]

    这个问题在这里已经有答案了 我正在尝试将 Mockito 框架与 android 仪器测试一起使用 但无法正确初始化它 我有以下测试类 class MainKontorTest extends ActivityInstrumentation
  • 为什么带有隐式转换运算符的自定义结构上的 Assert.AreEqual 失败?

    我创建了一个自定义结构来表示金额 它基本上是一个包装器decimal 它有一个隐式转换运算符将其转换回decimal 在我的单元测试中 我断言 Amount 等于原始十进制值 但测试失败 TestMethod public void Amo
  • 如何模拟私有内部类

    我有一个 spring 应用程序 我想在像这样的控制器上创建一个单一测试 问题是Wrapper类是私有内部类 所以测试中看不懂Wrapper 是否可以在不更改控制器类的情况下使用 Mockito 来模拟它 我可以使用prepareData
  • 如何使用带有 EventHandler 的 NSubstitute 引发事件?

    我有一个定义多个事件的接口 其中一些事件具有委托类型EventHandler
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including

随机推荐

  • 如何在java中使用apache poi中的rowiterator?

    我尝试在java中使用apache poi读取excel文件 但是 Eclipse没有编译代码 public class ReadExcel public static void main String args throws IOExce
  • 如何获取所有EJB定时器?

    在 EJB 3 1 中 我可以在为特定 bean 获取的 TimerService 实例上使用 TimerService getTimers 来获取该 bean 的所有计时器 然而 我真正需要的是这个的系统范围版本 IE 我想要 EJB 容
  • 在同一窗口中绘制多种类型的图(线图、散点图、条形图等)

    我试图在同一窗口中绘制两种类型的图 即线图和散点图 折线图 第一幅图 中绘制的数据是代表气候指数 Y 与小数年 X 的浮动数值 我希望成为 散点图 的第二个图大致相同 但浮动数值代表河流流量 Y 与十进制年份 X 我尝试通过使用双 x 轴和
  • 如何在我的 iPhone 应用程序中通过 fbconnect 获取用户的 Facebook 个人资料图片? [复制]

    这个问题在这里已经有答案了 可能的重复 通过 iOS 获取 Facebook 图片时出现问题 如何在我的 iPhone 应用程序中通过 fbconnect 获取用户的 Facebook 个人资料图片 尝试更深入地了解http develop
  • NestedScrollView 内的 MapView 不滚动

    像这样在 xml 中膨胀我的 Mapview
  • 如何使用 spring security 2.0 在我的 JSP 页面中显示错误消息

    嗨 我现在正在使用 Spring Security 效果很好 但如果登录失败 则不会显示错误消息 我想知道如何显示错误消息 我已经在 applicationContext xml 中配置了 ResourceBundleMessageSour
  • 子流程变量[重复]

    这个问题在这里已经有答案了 1 import subprocess 2 raw raw input Filename lower 3 ip raw input Host lower 4 cmd subprocess call tcpdump
  • .css() 延迟后不会应用

    我想使用 jQuery 动态更改 div 上的背景颜色css 它起作用了 但后来我尝试添加一些延迟 但由于某种原因它停止了工作 我缺少什么 这是它的 MVC HTML div div div div JS nodelay hover fun
  • C# 和 VBA 之间的通信

    应老板的要求 我创建了一小组脚本 用于定期监视某些设备和进程的状态 随后使用相对复杂的 VBA 模块处理该信息 该模块收集所有信息 应用公式 设置范围并生成图表等 但存在两个问题 我是一名业余程序员 所以我的 VBA 例程效率很低 这对我来
  • SSH 会话中 TMUX 内的系统剪贴板 Vim

    我在 ssh 会话中的 tmux 中打开了 vim 如何让 vim 使用笔记本电脑的系统剪贴板作为默认复制粘贴 默认set clipboard unamed不工作 以防万一 两个系统都是 Ubuntu 如果您的终端仿真器支持 剪贴板集成功能
  • 迅速。结合。有没有办法在重试时多次调用发布者块?

    当发生某些错误时 我想使用 Swift Combine 中的 retry 多次发出网络请求 发布者内部的块仅被调用一次 这意味着当错误发生时 对真实应用程序仅发出一个请求 我的代码是 import UIKit import Combine
  • 如何将 crdate 和 cruuser_id 等标准字段与 TYPO3 和 extbase 一起使用?

    我有领域模型篮子和文章 如果我调用以下命令 我会收到购物篮中的文章 articlesInBasket basket gt getArticles 如何使用 TYPO3 标准属性 如 crdate 和 cruuser id 使用这样的东西会很
  • 将 @Autowired 与 AspectJ 和 Spring Boot 一起使用

    我想在 方面 中使用 Autowired 注释 我想在我的方面注入一个存储库 但是当我尝试调用自动装配类的方法时 会发生 NullPointException Aspect public class AspectSecurity Autow
  • 如何从MKmapview的可见区域获取半径?

    我能够获得地图视图的可见矩形 并且地图视图的中心点和跨度增量也可以从 mkmaap 视图方法获得 可见的是 mapView visibleMapRect用来 获取中心点 map view centerCoordinate使用并获得跨度 ma
  • 编写 std::copysign 的可移植 SSE/AVX 版本

    我目前正在使用 SSE 和 AVX 内在函数编写 QR 分解 线性系统求解器 的矢量化版本 其中一个子步骤需要选择与另一个值相反 等于的值的符号 在串行版本中 我为此使用了 std copysign 现在我想为 SSE AVX 寄存器创建一
  • data.table 按组外连接

    我正在尝试使用 data table 来填充我拥有的大型不平衡多维面板中缺失的观察结果 以下是数据示例 其中包含一些关于我想要的内容的评论 mydat lt structure list fund c 1 1 1 1 2 2 2 3 3 h
  • jquery.post 和 jquery.get 之间的区别?

    这两个 AJAX 调用有什么区别 为什么在使用 asp net mvc 框架时我会选择使用其中一个 一种使用 POST 一种使用 GET 就它们的用途而言 唯一真正的技术差异 如果我错了 请更正这篇文章 是 GET 对查询字符串的限制要短得
  • 找到覆盖整组区间的最少点数? [复制]

    这个问题在这里已经有答案了 给定一组区间 x y where 0 lt x y lt 2000如何找到可以覆盖所有间隔的最小点数 即每个间隔应包含结果点集中至少一个点 example Given Set of intervals 2 5 3
  • DESC 和 ASC 作为存储过程中的参数

    我有以下 SP 用于对新闻文章列表进行分页 正如你可能猜到的那样 count是要返回的行数 start是从中选择行的索引 按内部查询排序 orderby指示排序依据的列 并且 orderdir指示是否对一个方向或另一个方向进行排序 我原来的
  • 每个单元测试应该测试多少?

    我的每个单元测试应该检查多少内容 例如我有这个测试 TestMethod public void IndexReturnsAView IActivityRepository repository GetPopulatedRepository