惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
Latest news
Latest news
S
Schneier on Security
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
Spread Privacy
Spread Privacy
Cisco Talos Blog
Cisco Talos Blog
T
Troy Hunt's Blog
S
Secure Thoughts
C
Cisco Blogs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
O
OpenAI News
L
LINUX DO - 最新话题
T
Threat Research - Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园_首页
月光博客
月光博客
博客园 - 【当耐特】
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
D
DataBreaches.Net
美团技术团队
B
Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
有赞技术团队
有赞技术团队
D
Docker
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
H
Hacker News: Front Page
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
AI
AI
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

C#

asp net core 的工作站模式和服务器模式的区别 - V2EX C#上位机开发是用 winform 那种传统工业风还是 WPF 现代风 - V2EX paddleocr 的 C#集成问题 - V2EX C#中异步相关的问题 - V2EX .NET 换新的异步编程模型了,性能很强 - V2EX 想念 C# - V2EX 200 块有偿求助 C#高速读取串口,导致软件闪退的问题。 - V2EX 老师,我太想进步了——关于 C#学习 - V2EX visual studio 2022 代码提示消失 - V2EX Cursor 生成的代码有个大坑,排查了一晚上才找出原因 - V2EX C# 有哪些显著的缺点? - V2EX 有没有 Sematic Kernel 可以落地的应用推荐? - V2EX 请教下 C#有没有办法用装饰器全局监控方法执行时间 - V2EX 想用 c#的 mvc 实现一个功能. - V2EX Unity 双击 C#脚本默认打开 Visual Studio 没有代码提示如何解决? - V2EX 请问 c#有没有一些能规范学习的生产管理系统开源项目? - V2EX C#串口通信问题 求教 - V2EX C# 怎么同时交叉编译 windows Linux mac ?跟 go 一样 - V2EX ClosedXML 如何对一列数据设置高亮重复项?(高亮重复项是 Excel 的一种功能;不能手动给重复单元格设置背景颜色,这样的话用户删除重复项后不会自动去除高亮) - V2EX 求推荐软件开发练习项目的教学视频或书籍 - V2EX 如何在 visual studio 2022 中新建单元测试项目时默认使用最新版本? - V2EX C#有像 C++的 libevent 同样定位的高性能跨平台网络库吗? - V2EX 求助,如何正確劫持系統 DLL 調用 - V2EX C#生态里有啥简单一点的容易上手的开源后台管理系统吗? - V2EX .NET6 HttpClient 无反应也不超时? - V2EX 关于.NET6 httpclient 用 IPV6 还是 IPV4 的疑问 - V2EX 关于 C#调用 DLL 的疑惑 - V2EX C#程序员开发手机页面有什么适合的 UI 框架? - V2EX 求教大佬,用 C#如何操作 word 文档 - V2EX 如何配置环境变量才能让 dotnet 和 ipconfig 都可以工作? - V2EX C#的二维码摆渡解码遇到点问题 - V2EX 请教一个 sha256withecdsa 签名的问题 - V2EX C#中有什么专有名词来定义 方法.方法 这种调用方式么? - V2EX 请问是否有 C# “官方”文档? - V2EX 关于 c#软件的逆向分析 - V2EX c#程序里的一个字符串参数,可以在生成的 exe 文件里搜索到吗? - V2EX C#新建项目后新建的各种文件的作用是什么? - V2EX 请问这个访问控制声明是否有点多余? - V2EX 请教, c#语言中,一个回调函数中使用 lock 部分执行较慢的代码,后续执行回调函数中 lock 操作执行顺序是不是不能保证先执行顺序 - V2EX 既然已经继承了 BCL 中的 IComparable 接口,为什么还要自己写 CompareTo 方法的实现? - V2EX C#中类 类型的变量是通常所说的“对象么?”类的实例又是什么? - V2EX C# 类中的这个构造函数能不能省略? - V2EX 如何让 C# 窗体标签的语言默认是中文? - V2EX C# 中 this 关键字在 Forms 类中使用的困惑 - V2EX 2023 年了,值得入行 C#上位机吗? - V2EX 想学习辉芒微单片机开发,有大佬有学习资料和方式吗 - V2EX 使用 C#的 HPSocket 的一个问题 - V2EX C# 有没有 Rust 和 Lisp 那样, if/match 能直接求值,像三目运算符一样的功能? - V2EX 泛型存 List 的一个问题 - V2EX 有 C++基础入门 C#有推荐的书或课程吗,准备学习 unity 游戏开发
C#单元测试为什么不能过多使用 setup? - V2EX
huzhikuizainali · 2023-10-04 · via C#

这是一个创建于 984 天前的主题,其中的信息可能已经有所发展或是发生改变。

但是要注意,使用[Setup] 越多,测试代码可读性就越差。为了理解测试怎么得到实例,使用的对象是什么类型,人们不得不同时看文件里的两处代码。我告诉我的学生: “想象一下,代码的读者和你从未谋面也无法联系,在你离职两年之后才来读你的测试代码。你使得代码易读的每一个微小的努力,对他们都是极大的帮助。他们如果对你的代码有任何问题,周围都不会有人能够解答,所以你是他们唯一的希望。“如果读代码的人为了能理解你的测试而不得不在两段代码间来回地看,那可不是什么好主意。 pPOsKw6.png pPOsY6A.png pPOsa0P.png

请看上面这段单元测试的讲解,有两个问题:

1 、为什么“使用[Setup] 越多,测试代码可读性就越差。为了理解测试怎么得到实例,使用的对象是什么类型,人们不得不同时看文件里的两处代码。” 是因为由于 setup 的存在。所以每执行一次 test 标签的代码就会重新执行一次 m_analyzer = new LogAnalyzer(); 么? 但是这为什么会导致可读性变差。为什么会不得不同时看文件里的两处代码?而且书中说一段测试代码只能使用一个 setup 模块。所以何来“使用[Setup] 越多”的问题呢?

2 、为什么代码中最后一部分 public void TearDown () 说“不是必须的,在真实刹试中请不要使用”

Zhuzhuchenyan

1

Zhuzhuchenyan      2023 年 10 月 4 日

Setup 是否会导致可读性变差我持中立意见,对于复杂初始化的操作 Setup 是很方便的解决方案。

TearDown 确实不是必须的,因为每次 Setup 都会给 m_analyzer 一个新示例,不需要强行赋值 null 来清理。

huzhikuizainali

2

huzhikuizainali      2023 年 10 月 4 日

@Zhuzhuchenyan 谢谢回复
关于 setup 可读性的问题,你能猜出作者的意思么。他举的这个例子不一定很恰当。但是如果一个测试程序有几十个 test 标签呢?会有可读性的问题么?但我想真要这么多,可读性与有没有 setup 也没什么关系了吧?

TearDown 既然不是必须。代码清单中加入 TearDown 的目的是什么?想告诉读者什么信息?你能猜到么?

doghappy

3

doghappy      2023 年 10 月 5 日 via iPhone

作者想表达的是,在一个测试中,非必要不使用 setup tearDown ,如果非要构造复杂的对象,应该创建一个方法去初始化,你的测试方法调用初始化的方法。

如果你测试不得已引入了状态维护,你有可能在进行集成测试,此时可能需要用到这些复杂的生命周期代码。

setup 和 自己创建一个函数初始化对象的不同之处是,一个是隐式的,一个是显式的,显示可读性高,而且还有命名加持,例如 CreateObjectWithX 。setup 不表意,而且有的测试类中有,有的没有。读测试时你需要去关注生命周期,阅读性就变低了。

作者不推荐使用,但是还是列出来,是想告诉读者 NUnit 有哪些 API ,普及一些框架上的知识

huzhikuizainali

4

huzhikuizainali      2023 年 10 月 5 日

@doghappy 谢谢回复。
1 、如果你测试不得已引入了状态维护,你有可能在进行集成测试,--------作者后面也提到了这个观点,与你说法一致

2 、具体到代码清单 2-2 虽然有两个 test 标签,但是本质还是在做单元测试吧?只是针对输入文件不同的情况分成两段 test 。因为怕彼此状态关联。所以引入 setup 。我没学过 C#,不知道根据上下文猜测的对不对?

3 、一个是隐式的,一个是显式的-----------setup 不是系统自带的么?怎么反而是隐式调用?我有点看不懂。
4 、原文中“使用的对象是什么类型,人们不得不同时看文件里的两处代码。”--------这个意思你理解么?看文件里的两处代码这不是看代码的常态么?为什么 setup 的使用会加大这一困难?

doghappy

5

doghappy      2023 年 10 月 6 日 via iPhone

A2:从 2 个测试来看,我们能够理解到,每个测试运行前,都会由测试框架调用 setup 方法,也会掉用 tearDown ,这里我理解为作者想告诉我们,这两个方法每个测试都会掉用。 因此有可能会被误用,进行对象初始化。

A3 A4:是系统自带的,但是代码分离了。有的测试类中,可能没有 setup 方法,有的有。如果你正在阅读的 class 内容比较多,当你看都某个 test 方法时,你会想 m_analyzer 是一个字段,它在哪里被初始化呢?当你转到定义时,发现初始化是 null ,这时候你会猜测它可能在构造函数被初始化,然后你去看构造函数,发现没有构造函数,再父类里面被初始化的?但是没有父类。这是你得搜索所有代码,终于找到,原来 setup 中有进行初始化。我把这种叫“隐式”。因此我们发现 setup 容易被人忽视,作者的例子是比较短,所以你可以一眼看到初始化过程和 dispose 过程。

huzhikuizainali

6

huzhikuizainali      2023 年 10 月 6 日

@doghappy 谢谢你的回复

关于“原文中“使用的对象是什么类型,人们不得不同时看文件里的两处代码。”。我觉得你的答案是最合理的。还有几处想向你请教

5 、从代码清单 2-2 来看,setup 初始化对象 m_analyzer 是放在代码最顶端。一般看代码是不会看不到最顶端的吧?你说”当你转到定义时,发现初始化是 null “ 。这个定义在代码中是哪一句?

6 、实际工作中从代码可读性,可维护性来看。是不是对象初始化的语句和对象使用的语句相隔不能太远?一般公司代码规范会对此有明确规定么?

forgottencoast

7

forgottencoast      2023 年 10 月 11 日

歪个题,这个问题不属于 C#,这是 NUnit 测试框架的问题——可以归类于.Net
不过这个问题可能比较有代表性。
如你#6 回复的第 6 点,是的,应该这样说,声明对象(或者创建、构造)的语句应该尽可能的接近使用的地方。
我觉得作者就是这个意思。当然#3 也给出了很好的解释。
代码规范最多也就我这句话的建议,没办法给出具体的规定,毕竟代码的可读性和可维护性对业务不会产生什么影响。遵从这些最佳实践短期来说很难看出效果,长期来说好处又很难体现并且难以跟踪,公司管理层不重视是很自然的。所以,一般很多公司都不会有这么细节的规范。