Chrome设置网络延迟与带宽

Developer Tools开发者工具查看网络请求 Windows: F12键 Mac OS: option+command+i键 打开网络请求Network 请求网址http://aimer1124.github.io/后,Network中便会有本次的网络请求内容 点击第一条请求http://aimer1124.github.io/,可查看到此网络请求的详细信息Request/Response 切换到Timing栏中,显示具体的请求时间消耗 切换Headers、Preview、Response、Cookies,也可直接查看对应的信息 设置网络延迟和带宽 点击No throttling会显示出Chrome已提前设置好常用的网络延迟和带宽,供直接选择 网络类型 带宽 延迟 Offline 0kb/s 0ms GPRS 50kb/s 500ms Regular 2G 250kb/s 300ms Good 2G 450kb/s 150ms Regular 3G 750kb/s 100ms Good 3G 1Mb/s 40ms Regular 4G 4Mb/s 20ms DSL 2Mb/s 5ms WiFi 30Mb/s 2ms 选择GRPS,clear网络请求,再次刷新页面,查看请求http://aimer1124.github.io/的Timing 此时,可查看到对应的网络延迟已经生效 自定义网络延迟和带宽 点击No throttling-Custom-add进入Network Throttling Profiles设置页面 设置Profile Name:slow1S,Throughput:10,Latency为:1000 关闭设置框,切换No throttling为slow1S,自定义网络延迟与带宽设置完成 参考 Measure Resource Loading Times:https://developers.google.com/web/tools/chrome-devtools/profile/network-performance/resource-loading#network-panel-overview Device Mode & Mobile Emulation:https://developer.chrome.com/devtools/docs/device-mode

March 9, 2016 · 2 min · Yuanjie

Git添加ignore文件

Git Ignore 忽略特殊指定的文件 gitignore - Specifies intentionally untracked files to ignore 操作 全局忽略 直接使用命令git config --global core.excludesfile ~/.gitignore_global 未添加到仓库的文件 直接在仓库根目录创建.gitignore文件 在文件中配制所需要ignore的文件清单 还原的话,直接在.gitignore中删除对应的配制行即可 已提交到仓库的文件 先更新仓库至最新版本 添加指定指定的忽略文件git update-index --assume-unchanged Gruntfile.js,此处忽略Gruntfile.js文件 还原的话,使用命令git update-index --no-assume-unchanged Gruntfile.js,重新添加对Gruntfile.js文件的追踪 建议 Github官方提供的常用各种ignore文件大全,https://github.com/github/gitignore 将.gitignore文件提交到远程仓库中,便于整个项目的管理 .gitignore添加文件的原则 临时生成的文件 本地调度需要经常变更的文件 日志文件 编译生成的中间文件,如Java的.class文件 参考 Git之ignore文件: http://www.douban.com/note/476292319/?type=like Git官方推荐ignore内容:https://github.com/github/gitignore Git官方配制ignore方法:http://git-scm.com/docs/gitignore

March 8, 2016 · 2 min · Yuanjie

Jenkins with Grunt

Jenkins In a nutshell, Jenkins is the leading open source automation server. Built with Java, it provides hundreds of plugins to support building, testing, deploying and automation for virtually any project Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 ...

March 3, 2016 · 3 min · Yuanjie

Http-Header

Header 定义 提供HTTP所需要的信息或发送的信息 HTTP header fields provide required information about the request or response, or about the object sent in the message body. ...

February 29, 2016 · 3 min · Yuanjie

SuperTest-header:Auth设置

SuperTest SuperTest-API测试 Auth分类 Basic:基本身份认证,直接采用:用户名密码 基本用法 1 2 3 4 5 6 it('should receive a status code of 200 with login', function(done) { request(url) .get('/staging') .auth('the-username', 'the-password') .expect(200, done); }); Base64加密 1 .set("Authorization", "basic " + new Buffer("username:password").toString("base64")) Digest:摘要式身份认证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 request.get('http://some.server.com/').auth('username', 'password', false); // or request.get('http://some.server.com/', { 'auth': { 'user': 'username', 'pass': 'password', 'sendImmediately': false } }); // or request.get('http://some.server.com/').auth(null, null, true, 'bearerToken'); // or request.get('http://some.server.com/', { 'auth': { 'bearer': 'bearerToken' } }); OAuth Authentication 例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var OAuth = require('openauth'); var request = require('superagent'); require('superagent-openauth')(request); var oauth = new OAuth(consumerKey, consumerSecret, {...}); request.post('https://api.twitter.com/1.1/statuses/update.json') .sign(oauth, token, tokenSecret) .type('urlencoded') .send({status: 'hello world'}) .end(function(res) { console.log(res.status, res.body); }); OAuth 1 1 request.sign(oauth, token, secret); oauth: OAuth instance token: string access token secret: string access token secret ...

February 28, 2016 · 1 min · Yuanjie

Gauge学习

之前梳理的Gauge的资料,存放到这里,便于以后使用。

February 19, 2016 · 1 min · Yuanjie

Tricky test scenario

测试验证码,收到客户投诉 Scenario 作为普通用户,在用户注册时,可通过获取短信码使用手机号进行注册 功能 用户注册时,需要测试手机号码与获取的短信码是否能正常收到且匹配。 短信验证码由本项目生成,但由第三方来发送 验证码发送是由第三方提供的,无法完全Mock 数据库中会记录收到的短信验证码. 测试策略 测试验证码能否匹配时,用了自己的手机号码来测试. 后面再测试是否匹配时,发现没有手机号码可用,就 随机 输入了手机号码进行测试,通过查询数据库来获取验证码 Tricky 如上进行了一阵子测试,由于是国内某银行项目,后面就收到了客户投诉: 没有进行任何的操作,便收到了短信验证码 分析 是否每次测试时,都需要通过第三方来发送短信验证码. 仅Mock第三方收到请求,不需要每次都真实的发送短信功能 TIPS 测试中,一定要确保 普通用户 不会收到短信验证码 同样返回内容,在不同的浏览器中显示不同 Scenario 作为普通用户,在浏览页面时,可查看到Title显示的内容 功能 需要从第三方系统中获取指定的内容,返回给浏览器,并显示到Title 测试策略 为确保兼容性,使用不同的浏览器进行查看 涉及浏览器: Chrome,FireFox,IE Tricky 仅Chrome查看正常显示,FireFox/IE查看均会显示 部分 乱码 分析 返回的内容中有 Unicode 值为15的内容,这个返回值引起的显示乱码 TIPS 在对第三方集成时,一定要先针对所有输入/输出内容均进行字符集处理.确保所用的字符集均一致 同样的样式,在同一类浏览器中显示不同 Scenario 作为普通用户,在浏览页面时,可查看到正确的页面显示与布局 功能 在页面布局测试时,需要查看页面的显示与布局的正确性 测试策略 使用浏览器查看页面的显示与布局 Tricky 在测试电脑中,发现页面的布局中的样式有问题(按钮被换行) 在DEV的电脑中完全是好的(使用的同一发布版本进行测试) 分析 浏览器的版本是完全一致 浏览器的 缩放比例 不同,测试电脑的页面被设置为 缩放90% TIPS 在测试页面的显示和样式时,一定要确保页面 浏览器版本、页面缩放 完全一致 PaaS平台部署后,时间出现偏差 Scenario 作为普通用户,在注册新用户时,需要使用获取的验证码在5分钟内进行验证,否则验证码失效 功能 页面前端点击 获取验证码 后,需要在生成验证码5分钟内,进行注册 生成的验证码会存储在 数据库 中 生成验证码是由程序代码生成,有效期的验证是由生成验证码时生成的Createtime和当前时间比较 测试策略 在点击 获取验证码 后,从数据库中查询生成的 验证码 通过查询的验证码,进行用户注册 Tricky 在点击 获取验证码 后,直接去数据库中查询验证码 使用查询获取的验证码,在进行用户注册时,提示验证码已过期(查询与注册的时间操作差,绝对在5分钟内) 分析 此功能在非PaaS平台时完全正常的 部署到Paas平台后,在PaaS平台时,程序代码是部署到一台机器、数据库部署在另外一台机器 验证码的生成时间是由数据库脚本生成,获取的数据库的当前插入时间 验证码有效期验证时,当前时间为从程序代码部署的机器获取当前系统时间 两台部署机器时区设置不一致(程序代码:Asia/Shanghai,数据库:Etc/Zulu),两个时区相差8小时 TIPS 部署环境时,一定要先确保时间的设置是否会对功能有影响 涉及到时间处理时,一定确保使用的是统一的参考时间 Mock的模块在集成后,Mock相关的功能出错 Scenario 作为普通用户,在查看个人账户时,可查看到账户余额 功能 普通用户在查看个人账户时,需要通过系统去查询第三方系统数据 在开发环境中第三方系统无法直接连接进行调试开发,因此提前做了Mock进行开发 测试策略 测试时,正常使用个人账户查询结果 Tricky 在到ST测试环境时,无法正常查询账户余额。数据解析报错 分析 使用Mock返回的数据时,在ST环境可正常查询 但使用第三方真实返回的数据查询时,在ST便会报错 对真实数据进行分析,发现数据结构已与之前Mock的不同 TIPS 针对Mock系统,一定要有对应的测试,确保接口的正确性及数据正确性 针对需要Mock的功能,一定要定期与集成方沟通,确保开发功能、接口变同的同步 特定文件内容无法上传到生产环境,其它环境均正常 Scenario 作为注册用户,在个人信息中,可上传文档 功能 注册用户,可使用上传文档功能,上传个人文档 针对上传的文件内容及类型均无限制(由于系统是特定人群使用,所以对文件类型均没有限制),文件大小此处不考虑 测试策略 针对上传文件类型进行测试:txt/exe/pdf/doc等 Tricky 上传txt/html时,若文件以**<**开头时,上传功能在其它环境均可正常使用,但在生产环境则上传会失败 分析 生产环配制有网关,会对文件内容进行过滤 若文件html/js/txt文件中以**<开头时,则会被判断为注入**文件 TIPS 作为测试人员,也要对安全测试常出现的问题进行考虑 参考资料 PAAS:https://en.wikipedia.org/wiki/Platform_as_a_service 时区差:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones Asia/Shanghai:https://en.wikipedia.org/wiki/Asia/Shanghai Etc/Zulu:http://www.prokerala.com/travel/timezones/Etc/Zulu Mock:https://en.wikipedia.org/wiki/MockServer ST测试:https://en.wikipedia.org/wiki/System_testing 安全测试:http://www.ltesting.net/ceshi/ceshijishu/aqcs/2015/0104/207771.html

January 30, 2016 · 5 min · Yuanjie

站点搭建过程

20220325 更新hugo版本,重新写起来 更新hugo版本至0.95 添加HCIA文章 20200402 启用网站本地搜索功能 启用本地搜索功能 使用百度搜索 20200401 CodeStyle变更为monokai 调整Code Style为monokai 20200325 ECS+备案 重大更新 站点生成从Hexo转移至Hugo 将源公开站点信息拖管至Github的Private仓库 将站点资源部署在阿里云的ECS中,在阿里云中申请SSL证书并关联网站 申请网站备案号 原有busuanzi统计全部失效,重新统计 按类型整理源文章,更新至对应的Folder 20200108 Donate 增加Donate功能(Alipay & wechat) 关闭右侧Tag功能 20200104 icarus主题 添加Theme Module,切换Theme至icarus git submodule add https://github.com/aimer1124/hexo-theme-icarus themes/icarus 20191225 更新Hexo版本 更新Node:12, Hexo:4 20191217 增加HTTPS 增加站点的HTTPS的功能,https://shiyuanjie.cn 20191216 替换留言功能Valine 更新留言功能至Valine,Theme Update git submodule update --init --remote -- themes/themeHexo ga themes/themeHexo gc -m 'Update Comments Plugin' gp 20181018 弃用Qiniu 由于qiniu官网的更新 每30天就会更换测试域名的地址,如果继续用未备案的域名的话,每30天就要把整个网站床图地址更新一遍,用了后期便于维护,把所有相关的图片都从qiniu迁移至github进行托管 20181017 启用卜算子统计 更新busuanzi官方链接:busuanzi.ibruce.info 20170322 评论转为Disqus 由于之前用的评论插件多说要关闭服务了,所以将评论的内容转移至Disqus 由于迁移后的原评论无法直接导入,所以原有评论均被清空了 , 20160926 添加本站的累积访问数据 添加页脚的访问总量和访客数 ...

January 30, 2016 · 4 min · Yuanjie

Node.js时间格式处理

moment库 专门用于Javascript的时间转化、验证、处理、展示 安装moment npm install moment 使用moment 引用moment 1 var moment = require('moment'); 转化时间 1 2 3 4 5 6 7 //将时间格式转化为:2016-01-22 21:21:26 moment(new Date()).format("YYYY-MM-DD HH:mm:ss"); moment().format('MMMM Do YYYY, h:mm:ss a'); // January 26th 2016, 10:25:00 pm moment().format('dddd'); // Tuesday moment().format("MMM Do YY"); // Jan 26th 16 moment().format('YYYY [escaped] YYYY'); // 2016 escaped 2016 moment().format(); // 2016-01-26T22:25:24+08:00 相对时间 1 2 3 4 5 moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago moment("20120620", "YYYYMMDD").fromNow(); // 4 years ago moment().startOf('day').fromNow(); // a day ago moment().endOf('day').fromNow(); // in 2 hours moment().startOf('hour').fromNow(); 日历时间 1 2 3 4 5 6 7 8 moment().subtract(10, 'days').calendar(); // 01/16/2016 moment().subtract(6, 'days').calendar(); // Last Wednesday at 10:27 PM moment().subtract(3, 'days').calendar(); // Last Saturday at 10:27 PM moment().subtract(1, 'days').calendar(); // Yesterday at 10:27 PM moment().calendar(); // Today at 10:27 PM moment().add(1, 'days').calendar(); // Tomorrow at 10:27 PM moment().add(3, 'days').calendar(); // Friday at 10:27 PM moment().add(10, 'days').calendar(); 其它应用 1 2 3 4 5 6 7 8 moment().format('L'); // 01/26/2016 moment().format('l'); // 1/26/2016 moment().format('LL'); // January 26, 2016 moment().format('ll'); // Jan 26, 2016 moment().format('LLL'); // January 26, 2016 10:28 PM moment().format('lll'); // Jan 26, 2016 10:28 PM moment().format('LLLL'); // Tuesday, January 26, 2016 10:28 PM moment().format('llll'); 其它使用:官方文档 API测试应用:Node.js 日期判断、对比 日期格式转化

January 26, 2016 · 1 min · Yuanjie

Node.js调用数据库:Mysql

安装Mysql包 npm install mysql 调用 Mysql包 1 var mysql = require('mysql'); 数据库查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var mysql = require('mysql'); var connection = mysql.createConnection({ host : '10.29.10.29', port : 3307, user : 'root', password : '', database : 'emall', //charset : 'UTF8_GENERAL_CI', debug : false }); connection.connect(); connection.query("use emall"); connection.query('select id from users', function(err,results) { if (err) { throw err; } }); connection.end(); 数据库插入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var mysql = require('mysql'); var connection = mysql.createConnection({ host : '10.29.10.29', port : 3307, user : 'root', password : '', database : 'emall', //charset : 'UTF8_GENERAL_CI', debug : false }); connection.connect(); connection.query("use emall"); var insertUser2 = "INSERT INTO `sms_verification_code` (`phone_number`, `code`) VALUES ('18392520000', '018227');"; connection.query(insertUser2,function(err,results,field){ if (err) { throw err; } }); connection.end(); API测试应用:Node.js 初始化数据 数据CRUD 获取部分无返回值的Post结果,如:查询创建用户后,获取用户的ID

January 26, 2016 · 1 min · Yuanjie