QA###

在Web开发中,质量可以分解为四个维度:

  • 到达率:

    到达率是指产品的市场普及程度,即查看网站或使用服务的人数。到达率和盈利能力是正相关关系:访问网站的人越多,购买产品或服务的人就越多。从开发的角度来看,搜索引擎优化(SEO)对到达率的影响最大,所以我们会在QA方案里包含SEO。

  • 功能

    人们一旦访问了你的网站或使用了你的服务,能否把用户留下很大程度上取决于网站功能的质量:一个能像广告宣传那样工作的网站更有可能吸引回头客。与其他几个维度不同,功能测试一般都可以自动执行。

  • 可用性

    功能关心的是功能的正确性,而可用性评估的是人机交互(HCI)。根本问题是:“这个功能是以对目标受众有用的方式交付的吗?”这个问题经常被换成“它易用吗?”,尽管追求易用性经常跟灵活性或能力是相对的:程序员眼中的“容易”可能跟不懂技术的用户眼中的“容易”不一样。换句话说,评估可用性时你必须考虑目标受众。因为可用性评估的根本输入是用户,所以可用性评估一般无法自动完成。然而,你的QA方案中应该包含用户测试。

  • 审美

    审美是四个维度中最主观的,因此也是跟开发最不相关的一个维度。尽管跟网站审美相关的开发问题没有几个,但QA方案中还是应该包括网站审美的常规评审。把网站展示给有代表性的样本受众,看他们是否觉得已经过时,或者是不是没能激起你所期望的响应。记住,审美具有时间敏感性(审美标准会随着时间而发生变化),并且因人而异(受到某一受众喜爱的东西可能完全激不起其他受众的兴趣)。

逻辑与展示###

从广义上来讲,网站上有两个“领域”:逻辑(业务逻辑)和表示。

可以认为网站的逻辑存在于纯粹的认知领域; 逻辑域中的事情应该尽可能简单清晰,而表示域复杂还是简单则视需要而定。表示域还是可用性和审美问题要关注的课题,而业务域则不是

测试的类型###

单元测试和集成测试(一般认为“系统测试”属于集成测试)

  • 单元测试的粒度非常细,是对单个组件进行测试以确保其功能正确
  • 集成测试是对多个组件甚至整个系统之间的交互进行测试

一般而言,单元测试在测试逻辑时更实用,也更恰当。集成测试则在两个领域中都有用。

QA技术概览###

  • 页面测试

    用来测试页面的表示和前端功能。这同时涉及单元测试和集成测试。我们会用Mocha进行页面测试。

  • 跨页测试

    对从一个页面转到另一个页面的功能的测试。比如电子商务网站上的结账功能,通常要跨越多个页面。因为这种测试会涉及多个组件,所以一般被当作集成测试。这个测试用的是Zombie.js。

  • 逻辑测试

    逻辑测试会对逻辑域进行单元和集成测试。它只会测试JavaScript,跟所有表示功能分开。

  • 去毛

    去毛不是要找错误,而是要找潜在的错误。去毛的一般概念是找出可能有错误的区域,或者可能在将来导致错误发生的问题代码。我们会用JSHint做去毛。

  • 链接检查

    对简单的项目做链接检查看起来可能没有必要,但简单项目也会发展成复杂项目,破损的链接也将会出现。越早把链接检查放到QA过程里越好。链接检查属于单元测试(链接有效或者无效)。我们会用LinkChecker做链接检查。

页面测试###

对于页面测试,建议把测试真正嵌入到页面中。这样做的优点是在做一个页面时,在浏览器中一加载页面就可以马上发现所有错误。

  • 将Mocha测试框架,这个包添加到项目中: npm install --save-dev mocha

注意,这里用的是--save-dev而不是--save,这是告诉npm要把这个包放在开发依赖项中,不要放在运行时依赖项里。这样当部署网站的现场实例时,可以减少项目的依赖项。

  • 因为Mocha要在浏览器中运行,所以我们要把Mocha资源放在public目录下,以便让客户端访问到。我们会把这些资源放在子目录public/vendor中:
mkdir public/vendor
cp node_modules/mocha/mocha.js public/vendor
cp node_modules/mocha/mocha.css public/vendor
  • 测试通常需要一个assert(或expect)函数。Node框架中有这个函数,但浏览器中没有,所以我们要用Chai断言库:
npm install --save-dev chai
cp node_modules/chai/chai.js public/vendor
  • 我们不希望测试一直运行。默认情况下测试应该是禁用的,但应该非常容易启用。为了满足这两个目标,我们准备用一个URL参数来打开测试; 访问http://localhost:3000?test=1将会加载包含测试的首页。

准备用一些中间件来检测查询字符串中的test=1。它必须出现在我们定义的所有路由之前:

app.use(function(req, res, next) {
res.locals.showTests = app.get('env') !== 'production' && req.query.test === '1';
next();
}); // 路由放在这里

如果test=1出现在任何页面的查询字符串中(并且不是运行在生产服务器上),属性res.locals.showTests就会被设为true。res.locals对象是要传给视图的上下文的一部分

  • 修改views/layouts/main.handlebars,有条件地引入测试框架

    修改部分:这里引入了jquery
<head>
<title>Meadowlark Travel</title>
{{#if showTests}}
<link rel="stylesheet" href="/vendor/mocha.css">
{{/if}}
<script src="//code.jquery.com/jquery-2.0.2.min.js"></script>
</head>

结束标签之前:

 {{#if showTests}}
<div id="mocha"></div>
<script src="/vendor/mocha.js"></script>
<script src="/vendor/chai.js"></script>
<script>
mocha.ui('tdd');
var assert = chai.assert;
</script>
<script src="/qa/tests-global.js"></script>
{{#if pageTestScript}}
<script src="{{pageTestScript}}"></script>
{{/if}}
<script>mocha.run();</script>
{{/if}}

上面还引入了/qa/global-tests.js脚本,这是每个页面上都要运行的测试; 我们会有选择地链接每个页面特有的测试,这样就可以针对不同的页面做不同的测试。我们先从全局测试开始,然后再增加针对各个页面的测试。我们先从单一的、简单的测试开始,确保页面具有有效的标题。

  • 创建文件tests-global.js:
suite('Global Tests', function(){
test('page has a valid title', function(){
assert(document.title && document.title.match(/\S/) &&
document.title.toUpperCase() !== 'TODO');
});
});

Mocha支持多种“界面”来控制测试的风格。默认界面是行为驱动开发(BDD),它让你以行为的方式思考。在BDD中,你描述组件和它们的行为,然后用测试去验证这些行为。然而,我发现这些测试经常不适合这一模型,然后BDD语言看起来就显得很奇怪。测试驱动开发(TDD)更具可行性,你描述的是测试集和其中的测试。你可以使用两种界面进行自己的测试,但会造成配置上的困难。因此我在本书中坚持使用TDD。如果你喜欢BDD,或者BDD和TDD混合的风格,当然也可以。

  • 运行网站,然后访问http://localhost:3000/?test=1;

接下来添加针对页面的测试。比如想确保关于页面上总是有一个指向联系我们页面的链接。

  • 创建一个public/qa/tests-about.js文件:
suite('"About" Page Tests', function(){
test('page should contain link to contact page', function(){
assert($('a[href="/contact"]').length);
});
});
  • 还要做最后一件事:在路由中指明视图应该使用哪个页面测试文件。在meadowlark.js中修改关于页面的路由:
app.get('/about', function(req, res) {
res.render('about', {
fortune: fortune.getFortune(),
pageTestScript: '/qa/tests-about.js'
});
});

express-4 质量保证(1)的更多相关文章

  1. express-5 质量保证(2)

    跨页测试 跨页测试更有挑战性,因为需要你控制和观测浏览器. 现在设置一个跨页测试情境的例子.比如,你的网站上有一个包含联系表单的Request Group Rate页面.营销部门想知道客户是从哪个页面 ...

  2. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  3. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

  4. Express 教程 01 - 入门教程之经典的Hello World

    目录: 前言 一.Express?纳尼?! 二.开始前的准备工作 三.测试安装之经典的Hello World 四.使用express(1)来生成一个应用程序 五.说明 前言: 本篇文章是建立在Node ...

  5. VisualStudio 2015 开启IIS Express可以调试X64项目

    现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢.   如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...

  6. Node.js Express连接mysql完整的登陆注册系统(windows)

    windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...

  7. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

  8. express全局安装后无法通过require使用

    今天入门了一下express,首先安装依赖. npm install express -g; npm install body-parser -g; npm install cookie-parser ...

  9. 初步认识Node 之Express

    通过本文,你会对Express有一个较为具体的了解.    起源 2009年6月26日,TJ Holowaychuk提交了Express的第一次commit,接下来在2010年1月2日,有660次co ...

随机推荐

  1. windows编程注意点(持续更新)

    1.windows编程中,所有的操作都放到窗口过程中进行,main函数只用于描述窗口基本信息. 2.用于获取设备环境句柄时,用BeginPaint/EndPaint,消耗cpu小,但占内存大;用Get ...

  2. oracle简历自增序列(转)

    步骤:1.创建序列   2.创建触发器. 语法解析:create sequence TB_CODE_SEQUENCEminvalue 1maxvalue 99999999999999999999999 ...

  3. $(inherited) "$(SRCROOT) 修改.a文件的路径 --Library Search Paths

    $(inherited) "$(SRCROOT)/.a文件所在的文件名" //如果有多个.a文件格式就像这样 $(inherited) "$(SRCROOT)/xxxx& ...

  4. cell分割线宽度不满屏处理

    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZ ...

  5. eclipse failed to create the java virtual machine 问题图文解析

    eclipse failed to create the java virtual machine 问题图文解析 分类: java常用软件异常2010-10-02 23:45 73200人阅读 评论( ...

  6. ecgcd(解二元不定方程)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=775 关于扩展欧几里得算法还是推一遍好啦: 有方程:a*x+b*y=d=gcd(a, b) ...

  7. android的JNI 、 NDK 学习!

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  8. 1 Ionic和Hybird应用介绍

    1.Ionic是什么,它和Angular.Cordova有什么关系? Ionic通过整合各种技术和功能使构建Hybird应用更加快速.容易和美观.Ionic生态系统基于Angular和Cordova, ...

  9. IOS 开发,调用打电话,发短信,打开网址

    IOS 开发,调用打电话,发短信,打开网址   1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString: ...

  10. Android Programming: Pushing the Limits -- Chapter 5: Android User Interface Operations

    多屏幕 自定义View 多屏幕 @.Android 4.2 开始支持多屏幕. @.举例: public class SecondDisplayDemo extends Activity { priva ...