我刚刚开始代码的时候,我从来不写任何测试。我就是觉得自己的代码里没有任何bug。我还觉得,当我对代码的某些地方做出改变、或是加入了一些新功能之后,所有代码依然可以继续运行。
后来我才知道,我太天真了。
虽然程序的功能没有出现什么大问题,但是奇怪的bug会突然出现。而且随着代码体积的增加,出问题的次数会越来越多。
不久之后,每当我需要添加新代码的时候,我就会陷入紧张和恐慌,总觉得新代码会让整个应用瘫痪。
就在这个时候,我接触到了测试驱动开发(TDD)。
TDD这种工作方式,能让你在给程序添加新功能的时候更有信心。它会让你感觉,添加新功能后,你的程序不会被破坏。
在开始使用TDD之前,你要先了解以下三个简单的原则:
之后,你就可以重构之前写的生产代码了。
这个过程可以被理解为红灯(失败测试)->绿灯(通过测试)->重构
通过遵循这些原则,TDD能帮你:
每一个测试都应该遵循下面这样的架构:
Setup:模拟一个函数,或是在数据库中添加一些row
Execute:调用你想要测试的方法
Assert: 验证你的结果是正确的
Teardown: 清理修改后的数据库记录或是被模拟的对象
我们用一个例子来讲解TDD的实际使用。
我们将会做一个在字符串中探测某种提及格式的函数,并且用一个用户名来替换他。提及格式是这个样子的:
@(userId)
现在,我们来写一个测试。在这个例子中,我会使用JavaScript Tape测试框架,因为它的使用相对简单一些:
const test = require('tape')
const parseMentionableText = require(‘./parse-mentionable-text');
test('should replace mentions with user objects', assert => {
const text = 'Hello there, @(2) and @(104)!';
const users = [
{ id: '2', name: 'John Doe' },
{ id: '104', name: 'Foo Baz' },
];
const actual = parseMentionableText(text, users);
const expected = 'Hello there, John Doe and Foo Baz!’;
assert.equal(actual, expected);
assert.end();
})
我创建了一个名叫parse-mentionable-text.js的文件,它的return为“OK”。
现在来运行测试,看看它是否会失败。
好的。当测试失败之后,我们开始这个功能之后,它并没有起作用。
这是非常重要的一部。在体积较大的代码库中,你有的时候可以针对一个逻辑来写测试,但是由于一些副作用的存在,一些原本应该失败的测试会显示通过。这意味着,你需要重新设计你的测试。记住——在进行测试的时候,刚开始一定要失败。
在测试失败之后,我们必须要确保用最少的代码让测试通过:
const { find } = require('lodash');
module.exports = (text, users) => {
const mentionRegex = /@\([0-9]+\)/g;
const stripMentionRegex = /[@()]+/g;
return text.replace(mentionRegex, (match) => {
const mentionId = match.replace(stripMentionRegex, ‘');
return find(users, { id: mentionId }).name;
});
}
要想检查我们的实施是否符合要求,我们必须要再运行一次测试:
好的!一切都按照我们预想的那样工作了。现在,我们需要清理代码,让它变得可读性更高:
const { find, curry } = require('lodash');
const stripMentionFormat = (mention) => mention.replace(/[@()]+/g, '');
const replaceMentionWithUsername = (users, mentionFormat) => {
const mentionId = stripMentionFormat(mentionFormat);
return find(users, { id: mentionId }).name;
}
module.exports = (text, users) => {
const mentionRegex = /@\([0-9]+\)/g;
const _replaceMentionWithUsername = curry(replaceMentionWithUsername);
return text.replace(mentionRegex, _replaceMentionWithUsername(users));
}
最好的部分,是在重构了代码之后,你可以进行检查,通过再次运行测试,来看看功能是否符合你的功能。
写代码前先写测试,这种工作方式会彻底改变你写代码的方式。在添加新代码的时候,这种方式能让你更自信。你不再害怕会破坏程序,并让你的工作速度更快。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。
IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。
结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。
全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。
输入手机号和拦截等级,查看是否是风险号码