单元测试原理

本文关键字:单元测试 | 更新日期: 2023-09-27 18:18:28

大家好,我开始学习单元测试或TDD。

我有一些c#的经验,所以我从follow link

开始https://msdn.microsoft.com/en-us/library/dd264975.aspx

按照样例,到目前为止一切顺利。

但是当我自己开始第一个方法时,

我有一些问题。

我写了一个名为"Log"的方法

它将创建一个时间戳为 的。txt文件。例如,在我调用Log("some thing error")之后;

它将创建一个文件201510210030.txt

内容为"[2015-10-21 00:30:47]some thing error"

我如何测试它?

我可以读日志文件吗?

但是每次我更改文件名,

也许我会在其他情况下改变折叠位置。

或者我可能会将日志更改为DB或一些日志服务器(带有IoC)

我如何测试它?连接到数据库或日志服务器?读取文件?

如果方法失败(DB关闭或文件验证失败balabala)太可能。

不够"单位",所以…如何测试这样的方法,

或者只是一些我不理解单元测试的概念。

非常感谢。

单元测试原理

对于单元测试(和所有事情一样),您需要务实。以100%的代码覆盖率为基准总是很棒的,但这通常是不现实的。一旦您开始在测试中引入实际的数据库或文件系统,您就离开了单元测试的领域,进入了集成测试的领域。集成测试绝对没有错,但重要的是不要混淆这两者。

我的建议是确保所有的日志逻辑都在它自己的独立类中,通过依赖注入提供给你正在测试的类(你提到了IoC,所以我假设你很熟悉)。这样做之后,就可以在类中传入一个模拟的"Logger",它根本不涉及文件系统。这将确保您正在测试的类将处理实现该"Logger"接口的任何内容。

如果你想对记录器本身进行单元测试,那么恐怕这是不可能的。日志记录器与文件系统(或数据库)紧密耦合,因此无法对其进行单元测试。您总是可以将所有持久性逻辑提取到另一个类中并模拟出来,但您只是将问题推回了过去。在应用程序和基础设施之间总是会遇到一堵墙,这两者是紧密耦合的。重要的是保持处理交互的类相对简单,并确保用集成测试对其进行了测试。