将 TDD 回顾性应用到 C# 代码库中的最佳选择

2024-02-16

我有一个由 5 个 C# 库组成的现有框架,该框架自 2006 年以来一直得到很好的使用,并且是我的大多数项目的主要代码库。我的公司出于软件质量的原因希望推出TDD;在学习了许多教程并阅读了理论之后,我了解了 TDD 的好处。

时间不是无限的,我需要为此制定务实的计划。据我所知,我看到的选项是:

A) 可以使用一个测试项目来重叠所有 5 个库组件中的对象。一系列高级测试可能是最初被视为非常大的软件库的起点。

B) 5 个库组件中每一个的测试项目。这些项目将在最低级别测试功能,与其他库组件隔离。

C) 由于代码被广泛认为是有效的,因此仅添加单元测试来修复错误或新功能。编写一个测试,该测试在包含错误的逻辑上失败,并提供重现该错误的步骤。然后重构代码,直到测试通过。现在您可以确信该错误已得到修复,并且不会在以后的周期中引入

无论选择哪个选项,都可能需要“Mocking”来替换外部依赖项,例如:

  • 数据库
  • 网络服务
  • 配置文件

如果有人有更多的意见,这将非常有帮助。 我计划在 Visual Studio 2010 中使用 Microsoft 内置的 MSTest。


我们拥有一百万行代码库。我们的方法是首先编写一些集成测试(您的选项 A)。这些测试几乎端到端地测试整个系统:它们从存储库复制数据库文件,连接到该数据库,对数据执行一些操作,然后将报告输出到 CSV 并将其与已知良好的输出进行比较。它们远非全面,但它们实现了我们的客户依赖我们的软件完成的大量任务。

当然,这些测试运行得非常慢;但六年后,我们仍然连续运行所有这些(现在分布在八台不同的机器上),因为它们捕获了我们仍然没有单元测试的东西。

一旦我们有了良好的集成测试基础,我们就花了一些时间围绕系统的高流量部分添加更细粒度的测试(您的选项 B)。我们有时间来做这件事,因为我们的代码质量很差。

一旦我们将质量提高到一定的阈值,他们就开始要求我们再次进行实际工作。因此,我们习惯了为新代码编写测试的节奏(您的选项 C)。此外,如果我们需要对尚未进行单元测试的现有代码进行更改,那么在开始进行更改之前,我们可能会花一些时间用测试覆盖现有功能。

您的所有方法都有其优点,但随着时间的推移,随着您获得测试覆盖率,相对回报将会发生变化。对于我们的代码库,我认为我们的策略是好的;集成测试将有助于捕获您在尝试打破依赖关系以添加单元测试时所犯的任何错误。

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

将 TDD 回顾性应用到 C# 代码库中的最佳选择 的相关文章

  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐