guess_number_game总结

阅读更多
一,对于tdd(Test-driven development)有了一定的了解,也体会到了测试的严谨性,下面列出主要的测试
1.一个随机的,不重复的四位数(千位可以为0),要分为4个步骤:
  ①保证这是一个数字

expect(number).not.toBeNaN();

  ②保证这是一个四位的
expect(number.length).toEqual(4);

  ③保证数字之间不重复
var not_repeated = should_not_repeated(number);
expect(not_repeated).toBeTruthy();

  ④保证这个数字是随机的
var is_random_number = should_one_random_number();
expect(is_random_number).toBeTruthy();

2.根据两个数字输出一个形如"?A?B"的字符串。这两个数字中有几个在相同的位置上有相同的数字则A前的"?"为几,除此之外,其他的相同的数字有几个则B前的"?"为几.例如:两个数字分别为"1236"和"1243"则应输出"2A1B"
  对于这个功能如果测试所有的用例则情况太多,有点违背了测试的目的,所以可以选取边界点和几个普通的情况来测试,例如:

it("should back 4A0B when guess 1234 for 1234 ", function () {
    var back_string = compare("1234", "1234")
    expect(back_string).toEqual("4A0B");
});

3.集成测试:也就是说我们要把前面的功能集合在一起.因为前面已经单独做了测试,所以我在这里没有做过多的测试,例如:
it("should back 4A0B when guess right", function () {
    var guess_number = localStorage.getItem("number");

    expect(compare(guess_number, localStorage.number)).toEqual("4A0B");
});

4.人机交互页面:这个功能要实现用户输入一个数字,机器做出检查并给出相关的提示信息.对于这个测试要测试所有可能操作产生的反应,情况较多,例如:
it("should output 2A1B if user guess 1236 while answer is 1243 in the first time", function () {
    document.getElementById("input_content").value = 1236;
    localStorage.setItem("number", 1243);
    document.getElementById("confirm").click();
    var information = document.getElementById("guess1").textContent;

    expect(information).toEqual("第1次尝试:2A1B");
})

二,具体实现方法
  ①如何生成一个随机的,不重复的四位数

function random_a_number() {
    var numbers = [];
    while(numbers.length<4){
        var number = parseInt(Math.random() * 10).toString();
        if(!_.contains(numbers,number)){
            numbers.push(number)
        }
    }
    return numbers[0] + numbers[1]  + numbers[2] + numbers[3];
}

  ②怎么测一个随机数,这里一直让我很纠结,最后确定了让其循环10000次,而每个数字最多出现10次
var numbers = [];
    for (var i = 0; i < 10000; i++) {
        numbers.push(random_a_number())
    }
    var grouped_numbers = _.groupBy(numbers, function (number) {
        return parseInt(number)
    })
    var counted_numbers = _.map(grouped_numbers, function (value, key) {
        return {"number": key, "count": value.length}
    })
    return !_.find(counted_numbers, function (counted_number) {
        return counted_number.count > 11
    })

  ③测试页面时不能只调用点击时应该调用的函数,而是要真正的实现人机交互--点击按钮,这样不仅可以测试函数是否正确还可以测试函数与按钮是否绑定,如:
document.getElementById("confirm").click();

三,遇到的其他问题
  ①文字乱码:


  ②github相关操作:
git reset --hard HEAD~3 //将最近3次的提交回滚
git push -f    //f为force

  ③stringObject.substr(start,length)与stringObject.substring(start,stop)
        substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
        substring() 方法用于提取字符串中介于两个指定下标之间的字符。

你可能感兴趣的:(tdd)