像TDD、ATDD、BDD大家都耳熟能详,并且这些方法学冠予敏捷美名。
做为一名敏捷开发的忠实粉,下面我谈谈对于自身做主程序员在测试方面的一些了解。
参考书籍
《 测试驱动开发的艺术》、《Junit In Action》、《验收测试驱动开发 ATDD实例讲解》、《Web敏捷开发之道》
TDD:需求分解、红->绿->重构循环、编写刚好完成需求码。
ATDD:在TDD编程技能之上的补充,实现用户故事,构建正确的软件而不是正确的构建软件。
我们先抄一下书籍上的测试分类,结合实践经验,后面用一个web工程示例来解释我们如何应用上这些测试。
集成测试
对象:测试多个实例化多个、并调用这些对象上的方法
服务:当应用程序部署到一个servlet或者ejb容器时运行测试,应用程序可能链接到一个数据库或者链接到其他外部资源
子系统:层次化的应用程序可能会有一个前端处理表示,还有一个后台业务逻辑。测试可以验证一个请求是否从前段传递到后端,并且从后端返回正确的响应。
功能测试
应用程序使用了一个框架:框架中的功能测试集中在测试框架API
应用程序有一个GUI:图形用户界面的功能测试是为了验证所有的特性都可以访问被访问并提供预期的结果。测试可以直接访问GUI,这也可能会调用其他的组件或后端程序。
应用程序由子系统构成:层次系统图按角色的不同来划分子系统。可能有其他表示子系统、业务逻辑子系统的数据子系统。层次化带来了灵活性,并且可以通过几个不同的前端来访问后端。每一层都会为其他层定义一个API来使用。功能测试主要是测试该层的API是否实现。
压力、性能测试
好理解,测试吞吐量、测试性能瓶颈。
验收测试
其他测试所有的超集。最终级别的测试,通常从功能测试开始、由客户或客户代理人进行。
程序员开发测试子集,方法有比较多。
单元测试
逻辑单元测试、集成单元测试、功能单元测试。通常要快速执行,不依赖与环境。
测试介绍:
一个web工程。
我们进行应用分成
domain层领域对象。执行领域逻辑。
application层应用接口,facade接口、提供事务写操作、组织领域对象逻辑。依赖domain层
querychannel层查询通道接口,提供数据库查询、搜索引擎查询接口。不依赖领域层
(application层与querychannel层分离实现CQRS)
web层,UI、控制web请求,组织application、querychannel调用并依赖他们。
infrastructure层基础设施,网络服务、数据库服务对application的repository跟querychannel相关实现等。
单元测试:
重中之重,大部分测试在单元测试中。
工具:Junit、EasyMock、sprint-test、struts-test、jasmine
domain层:New出领域对象,测试相关逻辑方面。Repository、DomainService等使用mock实现。验证相关领域对象操作方向后数据。
application层:组织Command对象,mock相关Repository操作,验证调用逻辑。
querychanel层:组织Condition对象,mock相关DataSource操作,验证sql组织,返回Dto对象数据。
web层:springMVC使用MockMvc测试Controller逻辑。struts使用StrutsTestCase测试action逻辑。
jasmine测试javascript相关逻辑
infrastructure层:测试工具方法、服务异常情况处理。不进行访问数据库等这些测试。
集成测试:
工具:dbunit、链接测试数据库spring-test使用事务回滚操作测试、链接测试cache服务器
application层、querychannel层、infrastruct层,在集成以上测试环境下,真实的调用数据库、cache服务器等这些操作。
功能测试:
工具:jwebunit、selenium
web层:运行模拟容器。使用jwebunit、selenium等进行模拟web操作的一个功能点。例如:登录。
压力测试:jmeter
web层,配置访问http脚本、并发线程数据、用户数、持续时间。
验收测试:(这里指程序员的测试子集)
工具:Fitnesse、selenium
web层:在fitnesse的wiki配置测试集(整合一个或多个功能测试)、准备相关数据表格。完成一个用户故事。例如:下单->支付->收货->确认收货的一个购物流程。
在工作实践,有不少测试难以编写,我们学会用强大工具配合,并编写可测代码。让编写测试成为一种乐趣。