2016.5.11

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"),第二个参数是一个实际执行的函数。

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

Mocha默认运行 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


为了得到我们预想的结果,我们可以把 i 赋值成一个局部的变量,从而摆脱外层迭代的影响。

for (var i = 0; i < 5; i++) {
  (function (idx) {
    setTimeout(function () {
      console.log(idx);
    }, 5);
  })(i);
}

打印结果:0 1 2 3 4

因为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 事件(事件调度器)




你可能感兴趣的:(2016.5.11)