JavaScript 単体テスト ABC_javascript のヒント

WBOY
リリース: 2016-05-16 17:54:33
オリジナル
988 人が閲覧しました

はじめに
現在、ソフトウェア開発の効率を向上させ、開発の品質を確保するために、単体テストが開発者からますます注目されています。以前は単体テストはサーバーサイドの開発で行われることが多かったのですが、Webプログラミングの分野での分業が徐々に明確になってきて、フロントエンドのJavaScript開発の分野でも単体テストを行うことができるようになりました。フロントエンド開発の品質。
サーバー側の単体テストには、JavaScript にも優れたフレームワークがいくつかありますが、この記事では、簡単な単体テスト フレームワークを段階的に実装していきます。
JS 単体テストには多くの側面がありますが、最も一般的なのはメソッド関数のチェックとブラウザーの互換性チェックです。この記事では主に最初のタイプについて説明します。

この記事で検証した JS コードは、以前に書いた JS の日付書式設定メソッドです。原文はここにあります (C# での使用法に似た JavaScript の日付書式設定関数)。コードは次のとおりです。 >

コードをコピーします コードは次のとおりです:
Date.prototype.toString=function(format){
var time ={};
time.year=this.getFullyear();
time.Tyear=("" time. Year).substr(2); .getMonth() 1 ;
time.TMonth=time.Monthtime.Day=this.getDate(); time.Daytime.Hour=this.getHours();
time.THour=time.Hourtime.hour=time.Hourtime.Thour=time.hourtime.Minute=this.getMinutes();
time.TMinute=time.Minutetime.Second=this.getSeconds() ;
time .TSecond=time.Secondtime.Millisecond=this.getMilliseconds();
if(format!=unknown && format.replace(/s/g,"").length>0){
format=format
.replace(/yyyy/ig,time. Year)
.replace( /yyy/ig,time.Year)
.replace(/yy/ig,time.Tyear)
.replace(/y/ig,time.Tyear)
.replace( /MM/g, time.TMonth)
.replace(/M/g,time.Month)
.replace(/dd/ig,time.TDay)
.replace(/d/ig, time.Day)
.replace(/HH/g,time.THour)
.replace(/H/g,time.Hour)
.replace(/hh/g,time.THour)
.replace( /h/g,time.hour)
.replace(/mm/g,time.TMinute)
.replace(/m/g,time.Minute)
.replace( /ss/ig, time.TSecond)
.replace(/s/ig,time.Second)
.replace(/fff/ig,time.ミリ秒)
.replace(/ff/ig, oNumber.toFixed(2 )*100)
.replace(/f/ig,oNumber.toFixed(1)*10);
}
else{
format=time. Year "-" time.Month "- " time.Day " " time.Hour ":" time.Minute ":" time.Second;
}
戻り値の形式;


このコードは現在存在しません。重大なバグが見つかりました。この記事のテストでは、.replace(/MM/g,time.TMonth) を .replace(/MM/g,time.Month) に変更しました。このエラーは役に立ちません。月が 10 未満の場合。2 桁で月を表します。
優れた設計はリファクタリングされるという格言がありますが、この記事でも同様です。最も単純な設計から始めましょう。
最初のバージョン: オリジナルのアラートを使用します
最初のバージョンとしては、非常に面倒なので、アラートを直接使用してチェックします。 完全なコードは次のとおりです。




コードをコピー
コードは次のとおりです:




デモ







実行後の 2012 年と 4 日の結果、date.toString("MM") メソッドに問題があることがわかりました。
この方法は不便で、最大の問題はそれです結果だけが出力され、正しい認証または認証された情報はありません。
第 2 版: 検証を実行します。
は、システムのこの状態に達する 1 つの予測に対して、表プログラム設計者が 2 つの数字を加算するために使用する方法のように、3 に対して実行します。 2、このメソッドが返される結果は 5 であると予想しています。5 が返された場合、それが通過するかどうかは、問題提案が表示されるかどうかを確認します。这里我们写一简单的肯定(assert) 方法:

复制代 代以下:
functionassert(message,result){
if(!result){
throw new Error(message);
}
true を返します。
}

この方法はパラメータを受け取ります、第一は错误後の情報、第二は確認结結果です
>

复制代 代码如下: var date=new Date(2012,3,9);
try{
assert("yyyy は通年を返す必要があります",date.toString("yyyy")==="2012");
}catch(e){
alert("テストに失敗しました:" e.message);
}
try{
assert("MM は月全体を返す必要があります",date.toString("MM")==="04");
}
catch(e){
alert("テストは失敗しました:" e.message);
}


运行後会弹出如下窗口:


第三版:进行批量测试

さらに、一般的なテストフレームでは、成功した数、失敗した数、および失敗したエラー情報が出力される可能性があります。検査結果を見やすくするために、ここでは結果を色の文字で表示するため、ここに小さな出力メソッドを書きます。PrintMessage:




代码如下:

function PrintMessage(text,color){
var div=document.createElement("div");
div.style.color=color; 🎜>document.body.appendChild(div);
delete div;


次に、バッチ テストを実行するための jsTestDriver と同様の TestCase メソッドを作成します。 🎜>

コードをコピーします
for(テスト中の変数テスト){
try{
tests[test](); " ,"#080");
successCount ;
}
catch(e){
PrintMessage(test " failed:" e.message,"#800");
}
}
PrintMessage("テスト結果: " testCount " テスト、" successCount " 成功、 " (testCount-successCount) " 失敗"、"#800"); > テスト コード:




コードをコピー


コードは次のとおりです:

var date=new Date (2012,3 ,9);
testCase("date toString test",{
yyyy:function(){ assert("yyyy は 2012 を返すはずです",date.toString("yyyy")= =="2012 "); }, MM:function(){ assert("MM は 04 を返す必要があります",date.toString("MM")==="04"); 🎜>}, dd:function(){ assert("dd は 09 を返すはずです",date.toString("dd")==="09");
}
}) ;


結果は次のようになります:



こうすることで、どれが間違っているかが一目で分かります。しかし、これは完璧でしょうか? 最後のテストでは、var date=new Date(2012,3,9) が testCase の外部で定義されており、さまざまな日付が testCase のテスト コード全体で共有されていることがわかります。メソッド内で日付値が変更されていないため、テスト結果が不正確になるため、多くのテスト フレームワークでは、テスト データの提供と破棄に使用される setUp メソッドと TearDown メソッドが提供されています。次に、setUp メソッドとtearDown メソッドを testCase に追加します。
バージョン 4: テスト データを均一に提供するバッチ テスト

まず、setUp メソッドと TearDown メソッドを追加します。



コードをコピー

コードは次のとおりです:



testCase("date toString",{
setUp:function(){
this.date=new Date(2012,3, 9);
}, tearDown:function(){ delete this.date; }, yyyy:function(){ assert("yyyy は 2012 を返すはずです" ,this.date.toString("yyyy")==="2012"); },
MM:function(){
assert("MM は 04 を返すはずです",this.date.toString ("MM ")==="04");
},
dd:function(){
assert("dd は 09 を返すはずです",this.date.toString("dd")= == 09");
}
});


setUp メソッドとtearDown メソッドはテストに参加しないため、testCase コードを変更する必要があります。



コードをコピーします


コードは次のとおりです:


function testCase(name,tests){
var successCount=0;
var testCount=0 ;
var hasSetUp=typeof testing.setUp == "関数";
var hasTearDown=typeof testing.tearDown == "関数";テスト中のテスト){ if(test ==="setUp"||test==="tearDown"){ 続行 } testCount; if(hasSetUp){ tests.setUp (); tests[test]();
PrintMessage(test " success","#080"); if(hasTearDown){
tests.tearDown ();
}

successCount ;
}
catch(e){
PrintMessage(test " failed:" e. message,"#800");
}
}
PrintMessage("テスト結果: " testCount " テスト、" successCount " 成功、 " (testCount-successCount) " 失敗"、"#800") ;
}


実行後の結果は 3 番目のバージョンと同じです。
概要と参考記事

前述したように、優れたデザインは継続的な再構築の結果です。これは単なる例です。この分野の知識が必要な場合は、後で各テスト フレームワークの使用法について書きます。

この記事は、初心者が JS 単体テストの概念を理解できるようにする単なる入門レベルの例です。専門家は、このトピックに提案を追加することができます。

この記事は、書籍「テスト駆動 JavaScript 開発」の第 1 章を参照しています (非常に優れていると思います。お勧めします)。この本のテスト ケースも時間関数ですが、書くのがより複雑で、初心者にはあまり適していません。
作者: Artwl
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート