项目上线,有时间总结一下当前的项目,对自己而言,一直是一个学习的过程。本篇总结我们的测试实践。本文分5部分,分别是:项目背景、系统架构与模块划分、我们的测试实践、自动化测试在项目中的价值与对自动化测试的进一步思考。
一、项目背景
所有对项目的介绍一定是从客户开始。
客户
:
我们的客户是一家全球领先的时尚内容提供商,通过遍布全球的员工,客户每天获取大量关于时装发布、产品设计、街边流行、城市热点等信息,这些信息的绝大部
分以图片的形式上传到公司服务器,然后由专职编辑对这些图片进行整理和归类(打标签),最后再由设计人员根据这些信息书写分析报表。
关键内容
:分类细致的海量高清图片和具有前瞻性的分析报表。
商业模式
:网站,行业内用户订阅-付费。
客户面临的问题
:同质化竞争、客户流失。
新系统的关键词
:CMS、更精确的内容分类、更好的全文检索、更好的用户体验(更有表现力的内容展现)、更快的内容发布。
二、系统架构与模块划分
1、REST的架构风格
系统采用了Sling作为WEB框架,JCR作为了底层内容存储框架。
系统的特点:
URI唯一标识资源
通过URI能够直接映射到JCR节点,例如http://localhost:80/content/section/news.html能够映射到JCR里的/content/section/news节点
GET/POST/DELETE标准方法对资源进行操作
支持标准方法对资源的直接操作
资源的多重表述
同一资源可以存在多种表述形式,例如http://localhost:80/content/section/news.html展现网页,
http://localhost:80/content/section/news.json展现资源信息的JSON描述,
http://localhost:80/content/section/news.pdf展现网页的PDF。
服务器端的无状态
通过JS获取当前用户信息并缓存在客户端。
2、系统分层
系统分为四层:JS、Servlet、Domain Model和JCR。
因为JCR提供了一套节点模型,所以Domain Model是在节点模型上的行为增强,例如所有对图片节点的操作我们封装在Asset领域模型里。
3、程序划分
程序分为两个大的模块:Migration和Bundles
。为什么叫Bundles?因为Sling使用了OSGI框架Felix。
Migration负责导入客户的遗留数据到新系统。之前客户的CMS运行已有10多年的时间,积累有大量数据。主要是各种类型的报表和图片。
Bundles实现系统功能。主要包括了定义报表模板、定义报表各种所见即所得的展现组件、实现对图片的管理、搜索(包括基于图片的可视化搜索)和其他七七八八。
三、测试实践
1、Migration的测试
自动化测试
对Migration,我们采用了TDD的方式。
输
入是客户实际提供的xml文件,输出是JCR里的节点。测试环境的搭建主要是在本地建立起Jackrabbit实例。我们的工作方式是这样:每天早上领到
一张migration故事卡,然后先写一个xml到jcr节点的集成测试描述出该类型报表的功能需求,接下来就是让这个测试通过。经过开始阶段的熟悉过
程,我们的速度保持在一对Pair一天一种报表类型的导入。
手工测试
将xml文件内容正常解析并导入JCR只是第一步,第二步我们需要在Bundles里为该类型的报表编写模板使之正常展现。由于涉及到报表样式,这个测试我们采用手工测试,这个工作也是QA工作的重要一部分。
在
最开始的开发中,我们没有导入所有报表数据进行测试。这带来了问题,由于客户遗留数据跨越10多年,各种数据形式都可能存在(特别是04年以前数据,给
UI带来了很大挑战),而最开始的开发中,我们只是使用了部分数据(09、10年数据)进行测试,这个导致了建立UAT环境时程序的很多返工以及QA的测
试压力。
2、Bundles的测试
自动化测试
对领域模型,我们采用了TDD的方式进行单元测试;在本地Jackrabbit实例里建立数据,领域模型封装数据测试行为。
对servlet,我们采用了TDD的方式进行集成测试(同时测试了servlet和领域模型),在测试中对request和response进行mock;
对JS,我们使用数据驱动的selenium功能测试进行覆盖。
我们最后的自动化测试结构:
手工测试
手工测试内容主要是功能测试。
自动化测试价值低的部分我们采用手工测试,这部分内容包括报表模板,相对独立,内容不多,一次测试处处通过;
自动化测试成本高的部分我们采用手工测试,这部分内容包括报表展现组件的编辑功能,因为采用了Ext JS,所以自动化测试困难;
无法自动化的测试:报表在线生成PDF,报表样式,WEBDEV批量上传图片等;
我们与QA的约定:
每完成一个用户故事,我们会与QA、BA一起mini showcase;
QA验收完成后编写功能测试用例;
我们对QA编写的功能测试用例进行自动化,共同维护一个功能测试列表;
对于不能自动化或自动化价值不高的测试用例QA继续使用手工测试。
四、我们感受到的自动化测试价值
1、通过自动化功能测试,我们使得需求对客户可视化;
2、QA的回归测试成本降低,尽管目前频繁的向客户实际使用环境部署,但QA每次部署只需要做一些简单的冒烟测试;
3、测试即需求,这点在TDD的开发过程中感觉非常明显,今天开发的目的就是使这个测试通过,避免了频繁部署到应用中进行测试,最快的电梯不是速度最快的电梯,而是中间停的楼层最少的电梯;
4、与持续集成一起,及时反馈。这点在进行JS代码编写时,心理上都非常依赖于selenium测试,对于没有测试覆盖的地方,没有安全感;
5、足够的单元、集成测试保证了频繁重构,没有人愿意引入BUG,没有足够的测试,没人愿意重构;
6、测试即文档,良好的测试和命名,使得新加入的成员非常容易理解当前代码的功能。
五、思考和讨论
1、自动化功能测试做到多少才合适?
当然是越多越合适,问题在于自动化功能测试成本要大大高于单元测试和集成测试,这些成本反映在测试环境的搭建、数据的准备,需要准备其他很多关联数据例如用户信息和权限信息、自动化功能测试的运行时间长、稳定性(随机成功/失败)、编写等等,需要权衡成本与收益。
个
人认为,自动化功能测试需要考虑的着重点包括:页面是否包含大量功能交互性JS(与展现性JS相对)?当前功能是否与其他功能共享一些代码?即独立性,独
立性越低越需要着重覆盖(这里又涉及到另外一个问题,即从各个模块里重构出共用代码是否总是合适?)。QA每次冒烟测试时是否需要重复回归(重复回归次数
越多,自动化越有价值)?经常失败的测试一定比不失败的测试价值更高?或者从未失败过的测试就没有价值?
2、单元测试?功能单元测试?
TDD
的测试粒度多大才合适?从我个人而言,几乎天然的反对mock,为了满足测试覆盖率的追求,强制将两个联系很紧密的类分开,做出各式各样mock,这真让
人气馁;stub也不是什么好东西,在一个曾经的spring项目里,在测试目录里,一堆一堆的测试xml配置文件让人有种呕吐的感觉。那就做集成测试
吧,两个类关系很好,那么就整体测试它们的输入和输出,看起来很不错,功能实现了,测试也没多写,也不用准备太多其他东西,但是打开实现代码,你就发现那
个丑陋,到处是复制和粘贴,是啊,不管黑猫白猫抓住老鼠就是好猫,只关注了当前结果,完全失去了TDD驱动简单设计的好处。
3、测试的重点是测试用例的设计,它反映出对需求的理解
那么结论就很明显,我们如果连需求就没有理解,如何进行实现,所以测试驱动是很自然的。
分享到:
相关推荐
### 自动化测试实践 #### 一、自动化测试的重要性与挑战 自动化测试是现代软件开发生命周期中的一个重要组成部分,它能够显著提升测试效率并减少人为错误。然而,在实践中,自动化测试也面临着诸多挑战,包括集成...
《QTP自动化测试实践》是一本深入探讨自动化测试技术,特别是使用QuickTest Professional(QTP,现称为UFT,Unified Functional Testing)工具的专著。该书的源代码提供了丰富的实例,帮助读者理解和应用QTP在软件...
自动化测试是现代软件开发过程中的重要组成部分,它能够提高测试效率,减少人为错误,并且...通过深入研究这份“自动化测试基础PPT”,读者将能系统地掌握自动化测试的核心知识,为今后的自动化测试实践打下坚实基础。
通过这个项目实战,我们可以学习到如何构建一个完整的接口自动化测试流程,包括选择合适的自动化测试框架、编写测试用例、执行测试和生成报告,这对于提升测试技能和理解软件测试生命周期至关重要。同时,对Python...
在IT行业中,自动化测试是软件开发过程中的一个重要环节,它极大地提高了测试效率,减少了人工测试的时间和成本。"自动化测试最佳实践示例视频"这个标题表明我们即将探讨的是如何有效地运用自动化测试技术,并通过...
《QTP自动化测试实践》是陈能技编著的一本专为软件测试人员设计的实战指南,共计420页,全面深入地介绍了QTP(QuickTest Professional)的使用方法和自动化测试策略。这本书旨在帮助读者掌握QTP的核心功能,提升自动...
这些文档集合为IT从业者提供了一个全面的学习路径,从性能测试的基础概念到实际操作,再到自动化接口测试和电商项目测试的具体实施,帮助读者提升测试技能并应对各种挑战。通过学习和实践这些内容,可以增强对系统...
### 敏捷开发中的自动化测试实践 #### 一、引言 随着信息技术的快速发展,软件产品的更新迭代速度越来越快,为了...以上内容仅为自动化测试实践的部分要点概述,具体实施时还需要根据项目的实际情况进行调整和优化。
标题中提到的“无人值守的自动化测试的实践之路”涉及的主题是自动化测试领域内的一种实践方式,即实现测试流程的自动化,以减少人工干预,提高测试效率和覆盖率。这种测试方式尤其在需要频繁进行回归测试的场景中...
项目的核心工具是APPIUM,一个广泛使用的跨平台移动自动化测试框架,支持Android和iOS应用的自动化。APPIUM允许测试工程师通过WebDriver协议与应用程序进行交互,使得测试脚本可以使用多种编程语言编写,如Java、...
`TestDemo`是一个专为演示自动化测试而设计的项目,提供了完整的测试案例集合,帮助用户理解并实践自动化测试的基本概念和技术。 `TestDemo`的最新版本被称为“全部测试案例无错版”,意味着在之前的版本中,为了...
Java+Selenium+Maven+TestNG自动化测试框架是现代软件开发中的一个重要组成部分,尤其是在Web应用程序的质量保证阶段。这个实例项目展示了如何将这四个强大的工具集成为一套完整的自动化测试解决方案。 **Java**: ...
"基于C# UI Automation自动化测试自动化测试示例工程" 是一个使用C#编程语言构建的项目,其核心目标是实现UI(用户界面)自动化测试。UI Automation是.NET Framework提供的一种用于测试Windows应用程序用户界面的...
Selenium是一个开源的Web应用程序自动化测试框架,支持多种编程语言,包括Python。它允许测试人员模拟用户在浏览器中的行为,进行功能性和回归性测试。在Python中,Selenium主要通过selenium库来实现,这个库提供了...
本文将详细解析一个以C语言为基础的简易自动化测试框架,旨在帮助开发者理解和构建自己的测试解决方案。 首先,我们要理解"自动化测试框架"的概念。自动化测试框架是一个系统,它提供了一种结构化的方法来编写和...
**Selenium2**是一个广泛使用的开源自动化测试框架,它支持多种浏览器和编程语言,如Java、Python等。其中,Selenium WebDriver是其核心组件之一,能够模拟用户交互并控制浏览器行为。 **Python**作为一种强大的...
【自动化测试流程在某国有大型银行项目中的应用】 在当今的金融行业中,特别是在某国有大型银行这样的关键机构,软件质量的保障是至关重要的。...这份文档为其他金融机构或大型企业提供了可参考的自动化测试实践案例。