TDD webstrom js git
閱讀導航
- TDD+Git 概述
- 問題解析和思考過程
- 測試+實現代碼
- 附件說明
TDD+Git 概述
TDD 概述
測試驅動開發(TDD)是一個依賴重復非常短的開發周期的軟件開發過程:需求變成非 常具體的測試用例,然后軟件只能通過新的測試。
特點描述
大多數傳統的程序開發是把問題拿到手后簡單分析就開始寫代碼,著重于在寫的過程中遇到問題就去解決,出錯就去調試。代碼量不大和問題分析不復雜的情況下,這樣的方法還是可行和省時。但是當代碼量大,問題復雜,細節分支多,需求多時,一旦出錯,調試起來很麻煩。還有一個問題就是,不能確保及時提交能編譯通過的代碼,對版本的控制和追溯會造成混亂。在TDD模式下,由需求和分析后的細節寫出測試類別,由測試來驅動開發,這樣的好處在于,我們在完成一項測試后能及時反饋對這條測試代碼的準確與否。
TDD編碼流程
- 分解任務,分出步驟
- 實例化需求,寫清需求細節
- 寫測試(test.js),只看需求和程序的輸入輸出不看中間過程
- 寫實現(achieve.js),只為當前的需求,用最簡單的方式通過即可
- 重構,采用方法消除代碼中間冗余和優化代碼
- 測試,修復,轉3
- 完成
注:一條一條的測試通過,細節劃分合理
Git 概述
GIT中是一個版本控制系統用于跟蹤的變化(VCS)的計算機文件和協調多人之間的那些文件的工作。它主要用于軟件開發,但它可以被用于跟蹤中的任何文件的變化。作為分布式修訂控制系統它是針對速度,的數據完整性,和用于分布式的,非線性的工作流的支持。
特點描述
- 無摩擦上下文切換。創建一個分支,嘗試一個想法,提交幾次,切換回分支的地方,應用補丁,切換回您正在嘗試的地方,并將其合并。
- 基于角色的編碼。有一個分支,總是只包含生產,另一個你合并工作進行測試,和幾個較小的日常工作。
- 基于特征的工作流程。為您正在處理的每個新功能創建新的分支,以便您可以無縫地在它們之間切換,然后在該功能合并到主線中時刪除每個分支。
- 一次性實驗。創建一個分支進行實驗,意識到它不會工作,只是刪除它 - 放棄工作,沒有人看到它(即使你推送其他分支機構)
個人理解:git的使用中我們可以隨時回退和查看之前的某一代碼版本(前提是曾提交到過代碼倉庫)以及看每一次版本之前的變化痕跡。初次之外還有一個極大優點,即上面提到的分支結構,可以多次嘗試不同的分支并記錄結構,之后可按需求進行比較選擇。而且這樣的話,對代碼的過程有很明顯的追蹤,在維護的時候也很高效。
常用命令
命令 | 示例 | 描述 |
---|---|---|
git init | ~ | 執行git init,當前目錄下多一個.git的目錄,這個目錄是Git來跟蹤管理版本 |
git add | git add test.js | 添加add后的文件到暫存區里面去 |
git commit | git commit -m '注釋' | 把文件提交到倉庫 |
git status | ~ | 查看結果 |
git diff | git diff test.js | 查看修改了什么內容 |
git checkout | git checkout -- file | 可以丟棄工作區的修改 |
git reset | git reset –hard HEAD^ | 直接恢復到上一個版本 |
git log | ~ | 顯示從最近到最遠的顯示日志 |
問題解析和思考過程
*Frequency Number需求:
我想要一個nodejs小程序,它可以幫我處理一段字符串信息,這段字符串信息是由英文單詞組成,每兩個單詞之間有空格,處理結果也為一段字符串,這個字符串應該每行只顯示一個單詞和它的數量,并且按出現頻率倒序排列
按TDD模式來:
- 分解任務,分出步驟
- 實例化需求,寫清需求細節
對于復雜問題,可能要一邊寫一邊補充新的用例,但對于這種簡單的題目,基本可以提前就想清楚用什么用例驅動去什么產品代碼。
大概可以想到如下的用例:
"" => ""
"he" => "he 1",一個單詞,驅動出格式化字符串的代碼
"he is" => "he 1\r\nis 1",兩個不同單詞,驅動出分割單詞的代碼
"he he is" => "he 2\r\nis 1",有相同單詞,驅動出分組代碼
"he is is" => "is 2\r\nhe 1",驅動出分組后的排序代碼
"he is" => "he 1\r\nis 1",多個空格,完善分割單詞的代碼
后面的步驟按TDD模式走下去,注意重構。在webstrom下本次測試用到的intellij的快捷使用方式已在另一篇文章中列了出來。WebStrom---IntelliJ快捷簡單使用
測試+實現代碼
/*
* jasmineTest.js @Lizexin
*/
describe("Word Frequency", function () {
it("returns empty string given empty string", function () {
var result = main('');
expect(result).toEqual('');
});
it("returns string given one word", function () {
var result = main('he');
expect(result).toEqual('he 1');
});
it("returns string given two different word", function () {
var result = main('he is');
expect(result).toEqual('he 1\r\nis 1');
});
it("returns string given two duplicated word", function () {
var result = main('he is he');
expect(result).toEqual('he 2\r\nis 1');
});
it("returns string given two duplicated words need to be sorted", function () {
var result = main('he is is');
expect(result).toEqual('is 2\r\nhe 1');
});
it("returns string given two duplicated words splited by multiple spaces", function () {
var result = main('he is');
expect(result).toEqual('he 1\r\nis 1');
});
it("returns string given long string splited by multiple spaces", function () {
var result = main('it was the age of wisdom it was the age of foolishness it is');
expect(result).toEqual('it 3\r\nwas 2\r\nthe 2\r\nage 2\r\nof 2\r\nwisdom 1\r\nfoolishness 1\r\nis 1');
document.write("result:"+"<br>"+result);
});
});
/*
* test.js @Lizexin
*/
var formatWordAndCount = function (word, count) {
return word +
' ' +
count;
};
var group = function (wordArray) {
return wordArray.reduce((array,word)=>{
let entry = array.find((e)=> e.word === word);//找對象
if(entry){
entry.count++;
}else{
array.push({word:word , count:1});
}
return array;
},[]);
};
var split = function (words) {
return words.split(/\s+/);
};
var sort = function (groupWords) {
groupWords.sort((x, y) => y.count - x.count);
};
var format = function (groupWords) {
return groupWords.map((e) => formatWordAndCount(e.word, e.count)).join('\r\n');
};
function main(words){
if(words !== ''){
let wordArray=split(words);
let groupWords = group(wordArray);
sort(groupWords);
return format(groupWords);
}
return ''
}
附件說明
提交過程:
遠程庫:
Chrome輸出:
感謝您花費時間閱讀這篇分享,歡迎您的分享和寶貴意見,祝您閱讀愉快!
作者 李澤鑫
2017年 4月 18日