express-4 质量保证(1)
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)的更多相关文章
- express-5 质量保证(2)
跨页测试 跨页测试更有挑战性,因为需要你控制和观测浏览器. 现在设置一个跨页测试情境的例子.比如,你的网站上有一个包含联系表单的Request Group Rate页面.营销部门想知道客户是从哪个页面 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- 【原】无脑操作:express + MySQL 实现CRUD
基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...
- Express 教程 01 - 入门教程之经典的Hello World
目录: 前言 一.Express?纳尼?! 二.开始前的准备工作 三.测试安装之经典的Hello World 四.使用express(1)来生成一个应用程序 五.说明 前言: 本篇文章是建立在Node ...
- VisualStudio 2015 开启IIS Express可以调试X64项目
现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢. 如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...
- Node.js Express连接mysql完整的登陆注册系统(windows)
windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...
- Node.js实现RESTful api,express or koa?
文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...
- express全局安装后无法通过require使用
今天入门了一下express,首先安装依赖. npm install express -g; npm install body-parser -g; npm install cookie-parser ...
- 初步认识Node 之Express
通过本文,你会对Express有一个较为具体的了解. 起源 2009年6月26日,TJ Holowaychuk提交了Express的第一次commit,接下来在2010年1月2日,有660次co ...
随机推荐
- 【python】mysqlDB转xml中的编码问题
背景:有mysql数据库,将数据从数据库中读取,并存储到xml中 采用了MySQLdb和lxml两个库 具体编码处理过程如下: . 指定mysql的编码方式 .取数据库data->判断data类 ...
- C#中DataTable排序、检索、合并等操作实例
转载引用至:http://www.jb51.net/article/49222.htm 一.排序1.获取DataTable的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新DataT ...
- UICollectionView cellForItemAtIndexPath 方法不走
在storyboard 中 UICollectionView cellForItemAtIndexPath not called 被坑了好久,各种问题点查找,终于解决了 解决办法: self.auto ...
- Ios cordova安装
安装NODEJS:http://nodejs.org/ (如果你安装了旧版本的需要手动安装npm,不过最新版的自带了) 进入终端命令行使用npm安装cordova如下: $ sudo npm inst ...
- Mysql手册—SQLStatementSyntax
14.1.1 ALTER DATABASE Syntax,可用于修改数据库字符集和校验规则 查看校验规则可如下: 由于utf8的校验规则都是ci(case insensitive),所以是不区分大小写 ...
- vector< vector<int> >类似于二维数组
vector< vector<int> > intVV; vector<int> intV; int i,j; ;i<;++i){ intV.clear(); ...
- hdu 5653 Bomber Man wants to bomb an Array
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5653 题意:已知炸弹可以炸掉左边L个位置,右边R个位置,那么炸点炸掉的总数是L+R+1.给定每个炸弹的 ...
- 三、jQuery--jQuery实践--搜索框制作
input标签讲解 <input/>作为按钮的type属性:button.submit(后面会有二者对比分析)
- C#值类型与引用类型
值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据.其在MSDN的定义为值类型直接包含它们的数据,值类型的 ...
- Faster-rnnlm代码分析2 - HSTree的构造
也就是构造一棵Huffman Tree,输入是按照词汇频次由高到低排序的 采用层次SoftMax的做法,是为了使得训练和预测时候的softmax输出加速,原有multinomal softmax,是和 ...