1.《浏览器端测试:mocha,chai,phantomjs》
mocha init 测试框架脚手架。
mocha init (显示错误,只有mocha init file 在file中才正确)
或者 mocha init .(点不要忘了)
. ├── index.html # 这是前端单元测试的入口 ├── mocha.css ├── mocha.js └── tests.js # 我们的单元测试代码将在这里编写
其中 index.html 是单元测试的入口,tests.js 是我们的测试用例文件。
我们直接在 index.html 插入上述示例的需要测试的函数以及断言库 chaijs。
然后在tests.js中写入对应测试用例;这时打开index.html,可以发现测试结果,我们完成了浏览器端的脚本测试(注意我们调用了 window 对象)
1)测试脚本
所谓"测试脚本",就是用来测试源码的脚本;
下面是一个加法模块add.js
的代码。
// add.js function add(x, y) { return x + y; } module.exports = add;
要测试这个加法模块是否正确,就要写测试脚本。
通常,测试脚本与所要测试的源码脚本同名,但是后缀名为.test.js
(表示测试)或者.spec.js
(表示规格)。比如,add.js
的测试脚本名字就是add.test.js
。
// add.test.js var add = require('./add.js'); var should = require('chai').should; describe('加法函数的测试', function() { it('1 加 1 应该等于 2', function() { add(1, 1).should.equal(2); }); });
上面这段代码,就是测试脚本,它可以独立执行。测试脚本里面应该包括一个或多个describe
块,每个describe
块应该包括一个或多个it
块。
describe
块称为"测试套件"(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称("加法函数的测试"),第二个参数是一个实际执行的函数。
it
块称为"测试用例"(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称("1 加 1 应该等于 2"),第二个参数是一个实际执行的函数。
昨天学的是should,今天看到的是expect。都可以从chai这个库里面得到。以下是expect的一些例子。也是非常接近自然语言的:
// 相等或不相等 expect(4 + 5).to.be.equal(9); expect(4 + 5).to.be.not.equal(10); expect(foo).to.be.deep.equal({ bar: 'baz' }); // 布尔值为true expect('everthing').to.be.ok; expect(false).to.not.be.ok; // typeof expect('test').to.be.a('string'); expect({ foo: 'bar' }).to.be.an('object'); expect(foo).to.be.an.instanceof(Foo); // include expect([1,2,3]).to.include(2); expect('foobar').to.contain('foo'); expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo'); // empty expect([]).to.be.empty; expect('').to.be.empty; expect({}).to.be.empty; // match expect('foobar').to.match(/^foo/);
3)mocha的用法
有了测试脚本,运行测试脚本即可
$ mocha add.test.js
test
子目录里面的测试脚本。所以,一般都会把测试脚本放在
test
目录里面,然后执行
mocha
就不需要参数了
2.正则表达式
漫长的记忆过程。之前看了现在又忘记了.
库。测试不容function速度的 bench..
4.npm install --save 与 npm install --save-dev 的区别
一个放在package.json 的dependencies , 一个放在devDependencies里面.
5.闭包以及闭包的坑
for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); }, 5); }
上面这个代码块会打印五个 5
出来,而我们预想的结果是打印 0 1 2 3 4。
之所以会这样,是因为 setTimeout 中的 i 是对外层 i 的引用。当 setTimeout 的代码被解释的时候,运行时只是记录了 i 的引用,而不是值。而当 setTimeout 被触发时,五个 setTimeout 中的 i 同时被取值,由于它们都指向了外层的同一个 i,而那个 i 的值在迭代完成时为 5,所以打印了五次 5
。
for (var i = 0; i < 5; i++) { (function (idx) { setTimeout(function () { console.log(idx); }, 5); })(i); }
因为idx变量只在函数块内有作用域。当i变化为1时,调用新的function,此时因为与之前的function不同(i为0的function还压在堆栈没有被调用),因此此时的idx必须是新的(之前的idx作用不到这个function来)
彻底明白了。
6.mysql培训
1)用户与授权
2)mysql 常用的函数
count/sum/max/min/avg/abs/round/cast/convert/ifnull/date_format/now/substr/concat
3)left join right join inner jion
3)group by 与select一起的时候注意select的个数与group by个数的一致,否则容易出错
4)mysql的不等于号 <>
5)select 语句 不论里面包含怎样的语句或者函数,不会改变原数据库中的数值
6)为null的字段或者字符类型,不能直接用在where查询中用于比较
7)mysql 事件(事件调度器)