1. 测试什么:
2. 良好测试的属性
1) 自动化
2) 全面
3) 可重复
4) 独立
5) 高质量,和产品代码一样对待
3. 何时运行测试
1) 写了一个新的方法,功能
2) 修了一个bug
3) 成功编译,修改了编译错后
4) Check in之前
5) 持续集成
4. Review测试代码,
1) 在写业务代码之前, TDD
2) 写好业务代码之后,业务代码和测试代码要一起review
5. 测试已有的代码
1) 代码中频繁出现问题的部分
2) 新添加的代码逻辑
6. Design
1) 关注点分离,使可测试的逻辑分离出来,也方便写出独立的测试
2) 弄清楚业务逻辑中的规律性,对这种规律进行测试
3) TDD,改善已有的接口
4) 验证输入,输出
5) 先写测试,TDD,便于写出可测试的代码
6) 设计要考虑可测试性
7) Test程度:也不能过度test,破坏了class的封装性,也不能为了test使软件过度松散,当然也不能滥用mock object,这会使得test不够友好,重构变难。可以对一些public的interface进行测试,然后对类的行为进行测试。
8) 表达意图:测试就是文档
9) 不要修改SUT (system under test), 如果我们使用了Test-Specific子类,要保证我们没有修改需要验证的业务逻辑,可能只是修改一些可访问性或者注入一些间接的输入。
10) 保持测试的独立性
11) 隔离SUT,使SUT和其他软件或者非测试部分无关,可以用依赖注入或者依赖lookup的方式输入test specific子类。使得测试不受其他部分影响。
12) 最小化测试的重叠部分
13) 最小化不可测试的代码,比如遇到GUI,多线程,要把可测试的代码分离出来
14) 使测试逻辑和产品代码逻辑分开,尽量不使用test hook
15) 将测试代码和产品代码同等对待
7. 测试陷阱
1) 以前的测试有问题没关系(代码重构后),测试不是产品代码不重要
2) Smoke test, assertTrue(true),无assert
3) 只能在某个或者某些特定的环境中跑通,比如本地standalone,windows等等
4) 浮点数问题
5) 测试要跑很长时间
6) 测试老是需要改动,可能代码强耦合,需要重构
7) 需要经常的debug
8) Test有时跑的通,有时跑不通,是不是用了随机数,产生不符合规范的测试数据, 环境是否有依赖性?
9) 测试不够自动化,经常需要手动干预
10) 测试代码的维护很困难:测试代码写的不够专业等等
11) 测试的时候没有问题,上了产品出现问题:测试是不是很久才跑一次?环境是不是有依赖?
8. 如何写一个测试
新代码
TDD
写一个失败的测试
编写代码让这个测试可以跑通
重复进行第一步和第二部
在这个过程中,主动地进行重构
当没有新的测试可以加入,所有测试也都跑通了,此时也就完成了
修改一个bug
找出bug.先
写一个失败的测试,标识出bug的存在
修改代码直至测试跑通
检验是否所有其他测试是否都能跑通,表示没有影响其他的代码逻辑
9. 测试依赖环境的setup 和 teardown
Fresh fixture: 每个test方法执行都会setup和teardown
Shared fixture:可以为多个test方法,test case使用,一般用于那种创建开销很大容易导致slow test的资源
Minimal fixture
Standard fixture
Setup:
· Test方法里自己构建,minimal fixture
· Setup方法:standard fixture
· Test utility,create方法
· Lazy loading,只能用于那些不需要teardown的
· Shared fixture,可以预先通过back door的方式准备好,可以用class static属性预先创建,可以用lazy load,可以用junit 4的@before, @after,甚至可以用test chain(个人认为不推荐,test之间存在依赖和交互,不够独立)
Teardown
Fresh fixture, 通常在teardown方法里实现,可以借助于test helper,基类。
如果是某个test方法特有的,可能需要在该test方法里的finally里实现,也可以借助于test helper。
10 Verification(assertion)
1) State assertion: 验证状态,输出。state assertion,
问题
· 相同的assertion如果经常重复出现在不同的test方法里?
可以用Expected object或者自定义的assertion来替换
· 如何增加assert的可读性?
可以用Expected object或者自定义的assertion来替换(test specific assertion,比如test 方法中含有条件判断逻辑,可以将这部分提取为自定义的assertion,从而保持测试代码的简洁和可读性。
2) Behavior verification: 验证交互,行为,间接输出,不仅仅是直接的返回结果。Mock Object可以验证和SUT之间交互的行为逻辑,或者用spy object判断过程的间接结果
3) Delta assertion:用在有shared fixture时,但是不能解决并发多个test同时执行出现的冲突问题,可以解决另外一个test修改了shared fixture,接着跑run这个test出现错误的问题。就是在test run之前先获得shared fixture的情况,run之后,验证变化,不验证绝对值。
4) Guard Assertion:将if 判断用assertNotNull或者其他assertion语句替换
11. Mock对象的使用
Mock什么
Mock的是依赖组件不是被测试的单元
何时需要Mock
实际对象的行为是不可预测的
实际对象很难准备,初始化,启动
实际对象的行为很难触发,重现
实际对象的行为很慢
实际对象需要人工干预,有UI
需要观察实际对象的内部行为
存在的实际对象是我们无法控制和观察的,比如当我们需要获取SUT的间接输入时
分类:按功能分
Test Stub
SUT对实际对象的间接输入有依赖性,test stub使得测试对SUT的间接输入有控制能力。
Test Spy
超越test stub,它还可以捕捉SUT的间接输出,由test方法来验证。
Mock Object
超越test spy,它也验证间接输出,也可以模拟间接输入,但是它的实现原理,使用方法和test spy是不同的。
Test stub,test spy,mock object都可以通过JMock生成,但test stub,test spy还可以通过hard code方式或者采取用户可配置的方式
Fake Object
Fake Object以极其简单的方式实现了实际对象的所有功能,它只是为test构建的。但是我们不会把fake object作为控制点和观察点。主要原因是因为实际对象很难创建,或者太慢等等,并不是为了验证它的间接输出或者内部行为。比如用hashtable fake数据库,内存数据库,fake web service,我们可以通过依赖注入或者lookup的方式将fake object和SUT关联起来,在实际使用中用实际对象替换
Dummy Object
只是为了凑足参数,dummy object什么都不干,但是区别于null,可能都是空实现,没有值。SUT不会和dummy object有逻辑交互。
12. 如何访问SUT的私有属性或者测试它的私有行为
同样的package名,存放于不同的folder下面
继承SUT,test specific subclass
反射
把属性或者行为改成public
13. 如何解决数据库的依赖问题
Database sandbox
一人一个database,schema更改后,保持database的同步。这其实并不能完全解决由于环境问题而导致的测试的不稳定性,因为某个developer自己的test之间也有可能出现db使用冲突。
每个测试人员,开发人员,测试相关人员都有一个本地的数据库,或者在服务器上都有一个虚拟机。使用一些轻量级的db或者in memory db。
不同的人配备不同的db schema,必须使用同样的数据库结构
使用共享的db,但是要保证不同的用户只能修改自己私有的数据,不能修改共享的数据。
存储过程的自动化测试
存储过程开发人员用db编程语言编写单元测试,并在db级别对其进行单元测试,这些测试是跑在db里的
不需要为写测试再多了解一门开发语言
测试和SUT保存在一个地方
可以TDD
应用开发人员用应用编程语言编写单元测试,并在应用级别对其进行测试,把存储过程当成黑盒进行测试,DbUnit
如何teardown db资源
Truncate table
Transaction rollback
1) 测试输出结果,测试返回结果的正确性
2) 测试边界条件
格式
顺序
范围
外部条件
值的存在,特殊值,null,0
时间
3) 测试行为,内在逻辑关系,验证相反的逻辑关系
4) 相互校验,反复核对,多种方式验证
5) 考虑所有可能出错的条件,模拟错误情况
6) 性能差,压力大,吞吐率小,响应率低等特殊情形
分享到:
相关推荐
【单元测试示例代码】 单元测试是软件开发过程中的一个重要环节,它允许...而通过压缩包中的"Solution"文件,我们可以看到整个项目结构,包括测试项目和对应的源代码,这对于学习和实践单元测试是非常宝贵的资源。
总结来说,`cl-unit-test` 是 Common Lisp 社区的一个宝贵贡献,它提供了高效、全面的单元测试解决方案,对于保证代码质量和促进软件工程实践具有重要意义。无论你是 Common Lisp 的初学者还是经验丰富的开发者,`cl...
"unit-test-android"项目专注于在Android环境中进行单元测试的实践与学习。本文将深入探讨Android单元测试的相关知识点,包括测试框架的选择、测试类型、测试原则以及如何进行有效的测试。 一、测试框架选择 在...
总结一下,`TestUnit #5.0_unittest#5_`可能是一个关于如何使用Python的unittest框架进行C++单元测试的学习资源,`TestUnit #5.0.cpp`是其中的源代码示例,展示了如何定义和运行单元测试用例。理解和掌握unittest...
ECU-TEST是一款由Vector公司开发的专业汽车电子控制单元(Electronic Control Unit, ECU)测试工具,它能够实现对ECU进行全面而深入的功能性测试,并且支持自动化操作。ECU-TEST的强大之处在于它不仅支持传统意义上...
总结,通过Parasoft C++ Test进行动态测试,不仅可以提高测试效率,还能增强测试的深度和广度。熟练掌握这些技能,对于提升软件质量、降低维护成本具有重要意义。在实际项目中,结合动态测试和静态分析,能够构建更...
12. **单元测试和持续集成**:掌握如何使用Delphi的单元测试框架(如DUnit或TestComplete)进行测试,以及如何与持续集成工具结合,可以确保代码质量和稳定性。 总的来说,学习Delphi不仅仅是学习语法,更重要的是...
- **测试选项**:启用静态测试(Enable Coding Standards),禁用单元测试(Disable Unit Testing)。 ##### 4.2 默认规则 C++Test内置了800多条规则,涵盖了Effective C++、安全性等多个方面。启用这些规则只需...
总结一下,"unit_test_medium"项目为我们提供了一个学习和实践JavaScript单元测试的实例。通过这个项目,我们可以深入理解测试框架的使用,学习编写高质量的测试代码,以及如何有效地管理异步测试和模拟依赖。这些都...
学习使用Xcode的内置测试工具如Unit Test和UI Test,以及使用断点、变量观察、步进调试等技巧。 通过这个"OC学习项目"的压缩包,你可以实际操作这些知识点,将理论与实践相结合,加深对OC的理解,进一步提升你的...
这篇资料是针对九年级学生的一份英语学习材料,主要涵盖了Unit 1 "How do you study for a test"的综合试题,适用于人教新目标版教材。试题内容涉及到词汇分类、短语翻译、单项选择等练习,旨在帮助学生巩固和检验在...
【九年级英语全册Unit8 It must belong to Carla.】单元是初中阶段英语学习的重要一环,本单元涉及了大量的词汇、短语以及句型结构,对于提升学生的英语听说读写能力有着关键作用。以下是该单元的重点知识总结: 1....
总结起来,"atunit-1.0.1.javadoc.jar.zip"是AtUnit 1.0.1版本的核心API文档,它为开发者提供了关于这个测试框架的详细指南。通过阅读和理解这些文档,我们可以更有效地利用AtUnit进行单元测试,提升软件质量,并...
总结来说,"unit-test-project-example"是一个展示如何在Java环境中利用JUnit进行单元测试的项目。通过这个项目,开发者可以学习到如何编写测试用例,使用断言验证结果,以及如何结合Mocking框架和构建工具来提升...
在九年级英语全册Unit1《How can we become good learners?》的学习中,我们探讨了如何成为优秀学习者的诸多要点。以下是对这些知识点的详细解释: 1. **have a conversation/talk with sb.**:与某人进行对话,是...
《新目标初三英语Unit3单元复习》是一份旨在帮助学生巩固和深化初三英语学习的知识点总结。这份PPT教案涵盖了词汇、短语、句型等多个方面,旨在提升学生的英语听说读写能力,为他们的中考英语备考打下坚实基础。 1....
总结来说,`js-unit-test-demo`项目是一个学习和实践JavaScript单元测试的好资源。通过它,你可以了解如何设置测试环境、编写测试用例以及如何集成到持续集成/持续部署(CI/CD)流程中。掌握单元测试是提升代码质量...
【最新仁爱版八年级英语(下册)unit5知识点总结】 在学习英语的过程中,掌握单元知识点至关重要。Unit5 "Feeling Excited"主要涉及情感表达、日常对话以及与生活息息相关的词汇和句型。以下是本单元的核心内容: ...
《Apex 工作手册》旨在为开发者提供一个系统性的学习资源,涵盖 Apex 语言的基础到高级概念,并通过一系列实践教程帮助读者掌握如何利用 Apex 在 Salesforce 平台上构建应用程序。手册内容详实,结构清晰,适合初学...