构造之法
2.1单元测试
大部分软件由多人合作完成,每个人负责的模块可能被其他人调用。为了避免因误解、疏忽或不了解模块变化而导致的错误,需要明确模块功能并确保模块质量。单元测试是一个有效的方法,可以确保每个模块的功能正常,并且不会影响其他模块。
2.1.1用VSTS写单元测试
小飞创建了一个C#类库,其中包含一个名为User的类,该类具有一个用户邮件地址作为标识。为了测试这个类,小飞使用Visual Studio创建了单元测试。创建单元测试后,会生成三个新文件:ClassTest.cs(单元测试文件)、DemoUser.vsmdi(测试管理文件)和Localtestrun.testrunconfig(本地测试运行设置文件)。要管理设置文件,需要双击它以进入设置界面。在单元测试中,Visual Studio自动生成测试骨架,但还需要自己完成一些工作,例如处理标注为//TODO的事情。
2.1.2好的单元测试的标准
好的单元测试的标准包括准确性、快速性和独立性。它应该在基本功能和参数上验证程序的正确性,测试每个方法和参数。最好由最熟悉代码的人编写,并保持机器状态不变,以便可以重复运行。单元测试应该快,每个类的测试应该在几秒钟内完成。此外,单元测试应该产生可重复和一致的结果,不能使用随机数来增加测试的真实性。单元测试的独立性很重要,每个测试都不应依赖于其他测试。
单元测试应该覆盖所有代码路径,包括错误处理路径。虽然这可能意味着要写很多测试方法,但这是为了确保代码的完整性和减少缺陷。
代码覆盖率并不等同于100%的正确性。例如,如果代码没有释放内存或处理异常情况,那么即使覆盖率很高,也可能存在问题。此外,还需要考虑代码效率、多线程环境中的同步问题以及条件语句的覆盖。
最后,“覆盖率”有多个层次,包括函数的覆盖、语句的覆盖、分支的覆盖和条件的覆盖,这些都是在编写单元测试时需要考虑的。
2.1.3回归测试
单元测试是软件开发中确保代码质量的关键环节。在单元测试的基础上,我们可以进一步进行回归测试。回归测试的目的是验证新代码是否正确地修复了缺陷,同时确保新代码不会破坏现有功能,防止出现“退步”的情况。“回归”在这里的意思是回到以前不正常的状态。为了尽早发现问题,回归测试最好实现自动化,以便快速运行所有测试用例。单元测试是回归测试的基础,除了关注模块的基本功能,还有功能测试,从用户角度检查功能的完成情况。在项目的最后稳定阶段,所有人都要参与全面的测试工作,对所有已修复的Bug进行验证,确保它们真正得到修复,并且不会在最终版本中“复发”。这种大规模、全面的回归测试是为了确保软件的质量和稳定性。
2.2效能分析工具
主要描述了一个程序员如何使用Visual Studio的效能分析工具来分析自己的程序。他首先编写了一个程序,用于分析文本文件中各个词出现的频率,并打印出出现频率最高的10个词。然后,他使用Visual Studio的效能分析工具对程序进行了分析,以找出程序的效能瓶颈。 在分析过程中,他首先进行了抽样分析,这是一种快速的方法,可以在程序运行时查看它在哪些函数内运行,从而找出程序运行时间最长的部分。然后,他进行了代码注入分析,这是一种更精确的方法,可以将检测代码加入到每个函数中,从而得到程序的各个效能数据。 通过分析,他发现程序中耗时最多的三个函数是:FreqOneWord、String.EqualsHelper和ArrayList.get_Item。这三个函数加起来占用了整个程序的84%的时间。因此,他决定对这三个函数进行更详细的分析,以找出为什么它们会被频繁调用并且开销如此之大。 最后,他通过调用关系树报告进一步分析了程序的运行情况。这个报告显示了程序中各个函数之间的调用关系,以及每个函数的运行时间。通过这个报告,他可以更清楚地了解程序的运行情况,并找出需要优化的地方。