程序员如何看待自测?为什么要关心测试?如何测试?本文根据相关问题进行总结,多篇来自极客时间专栏《程序员的测试课》。下一篇文章重点介绍集成测试的实践。1.为什么要写测试?关键原因:软件开发变得越来越复杂。测试使我们能够在日益复杂的软件开发中稳步前进。在写新功能的时候,测试可以验证我们代码的正确性,让我们一个一个拥有稳定的模块。测试可以帮助我们在长期的过程中不断回归,让每一步都更加稳定。隔离更改并逐步编写稳定的代码。2.程序员为什么要写测试?程序员的测试VS测试人员的测试程序员的重点是白盒测试,而测试人员的重点是黑盒测试。程序员的出发点是实现,而测试人员的出发点是业务。作为程序员,我们会花更多的时间去思考技术实现,我们在发现问题上的训练强度是远远不够的。因此,人们常说,不要用自己的爱好来挑战别人的吃货能力。程序员每多思考一点,软件的质量就可以提高一点。测试人员没有充分利用它们。程序员只有做好自己的测试,才能让测试人员从日常琐碎的验证工作中解放出来,去做更有价值的测试。3.单元测试最佳实践的要点:代码和测试一起写,保证测试质量:写完整个功能代码,再写测试,写这一堆的时候你已经很难记住所有的细节了ofcode,所以此时写上去测试对提高代码质量帮助不大。工作粒度要小:把所有功能都写出来粒度太大。为大型任务编写测试是一项非常困难的工作,这也是很多人觉得写测试难的一个重要因素。最小化对实现细节的约束:模拟时,倾向于使用更广泛的约束。这会在一定程度上减少未来代码重构的影响。4.确保你写的代码有100%的测试覆盖率。必须有一个可测试的设计来保证你的代码是完全可控的。测试和代码同步写入,隔离难测代码:对于无法测试的第三方代码,使用薄隔离层隔离代码,构建脚本中排除隔离层。5.集成测试即使是100%的单元测试也不能解决所有的问题。一个重要的原因是,我们在写每个单元的时候,都假设这些单元会很好地相互配合,但是这个假设一定是真的吗?答案不一定。除了要保证单位是正确的,还要保证单位之间的协作也是正确的。与只关注单元行为的单元测试相比,集成测试关注的是多个组件协同工作的性能。5.1集成测试的意义在于保证组件间协作的正确性;必须使用与产品代号相同的元器件组装工艺;测试稳定的组件可以作为基础。5.2两类集成问题及最佳实践5.2.1代码间集成1)选择任务执行路径,将路径上使用的组件集成在一起进行测试。当单元测试完成时,这意味着每个组件都已测试。因此,集成测试的重点不再是成对测试组件。2)集成框架,做完整的集成测试。尽可能融入,尽可能贴近真实场景。如果能把整个框架整合起来,这些东西就可以验证了。3)组件之间的集成逻辑不需要进行单元测试。这部分代码其实只是对业务逻辑的简单封装。主要工作是信息转发,会是很薄的一层。出于实际考虑,这里使用集成测试代替单元测试,以简化测试编写。5.2.2代码与外部组件的集成1)代码不能因测试需要而修改。如果真的需要修改,也许应该修改的是设计,而不仅仅是代码。业务代码中不能存在仅用于运行测试用例的特殊逻辑。6.测试比例模型6.1冰淇淋蛋筒模型冰淇淋蛋筒的出发点是考虑单个测试的覆盖率,只要少量的系统测试就足以覆盖大部分系统。当然,对于那些系统测试无法覆盖的场景,需要底层测试配合,比如集成测试、单元测试等。在冰淇淋甜筒模型中,主力是高阶测试,低阶测试只是高阶测试的补充。6.2测试金字塔模型6.3最佳实践新项目:使用测试金字塔模型逐层编写测试。每完成一个功能,代码和测试总是同步编写的,代码总是经过验证的,这样我们才能稳步前进。遗留项目:从系统测试入手,只要编写一些高层次的测试,就可以覆盖系统的大部分功能,快速建立起安全网。有了安全网的底线之后,我们还是要往测试金字塔的方向前进,以单元测试为整体的基础。7.编写测试的最佳实践7.1我们测试的目标是我们的代码,而不是外部依赖。由于其他库“JDK、二方库、第三方库、RPC等”导致的问题难以测试,我们可以逐层做Thin封装,然后在覆盖检查中忽略它。封装和忽略缺一不可。7.2编写可测试的代码使你的代码符合软件设计原则。编写可组合代码。不要在组件内部创建对象,组件组装使用依赖注入。ConstructorInjectionVSFieldInjection8.RetrofitingLegacySystems的最佳实践遗留系统是那些没有测试的系统,为遗留系统编写测试是让系统恢复正常的过程。为遗留系统编写完整的测试很困难。一个实用的改进策略是改变移动的地方。改造遗留系统的关键是解耦。对于耦合严重的对象,提取方法并将其移动到包装类中。编写可组合代码。9.单元测试、集成测试、系统测试对比9.1单元测试描述:开发者以尽可能小的粒度,通常是一个方法或一个类,对单元完成并编写测试。目标:确保每个部分都稳定。用例数:最多9.2集成测试说明:一般由开发人员完成,将多个单元集成在一起进行测试,一般测试完整的功能模块。一般集成Spring容器、内存数据库、已经Mocked的外部依赖等。目标:保证功能模块稳定。不要关注模块中的部件是否稳定“这是单元测试所做的”。用例数:较少9.3系统测试说明:测试人员完成并完全集成整个系统,可自动执行。不要关注实现细节,而要关注需求是否实现。实践:在不模拟外部依赖的情况下,在测试环境中测试整个应用程序。目标:确保整个业务稳定。理论上,不需要过多关注细节。“单元测试和集成测试理论上是这样做的,但实际上系统测试还是需要注意细节。”
