>  기사  >  웹 프론트엔드  >  JavaScript 단위 테스트 ABC_javascript 팁

JavaScript 단위 테스트 ABC_javascript 팁

WBOY
WBOY원래의
2016-05-16 17:54:33987검색

서문
현재 소프트웨어 개발 분야에서 단위 테스트는 소프트웨어 개발의 효율성을 높이고 개발 품질을 보장할 수 있어 점점 더 많은 관심을 받고 있습니다. 과거에는 서버 측 개발에서 단위 테스트를 자주 볼 수 있었지만, 웹 프로그래밍 분야의 분업이 점차 명확해짐에 따라 프런트엔드 Javascript 개발 분야에서도 관련 단위 테스트를 수행할 수 있습니다. 프론트엔드 개발의 품질.
서버측 단위 테스트에는 다양한 테스트 프레임워크가 있습니다. JavaScript에도 몇 가지 뛰어난 프레임워크가 있습니다. 하지만 이 글에서는 간단한 단위 테스트 프레임워크를 단계별로 구현하겠습니다.
JS 단위 테스트에는 여러 측면이 있으며, 가장 일반적인 측면은 메서드 기능 확인 및 브라우저 호환성 확인입니다. 이 기사에서는 주로 첫 번째 유형에 대해 설명합니다.

이 글에서 검토한 JS 코드는 제가 이전에 작성한 JS 날짜 형식 지정 방법입니다(javascript 날짜 형식 지정 기능, C#에서의 사용법과 유사).

코드 복사 코드는 다음과 같습니다.

Date.prototype.toString=function(format){
var time ={};
time.Year=this.getFullYear();
time.TYear=("" time.Year).substr(2)
time.Month=this .getMonth() 1 ;
time.TMonth=time.Month<10?"0" time.Month:time.Month;
time.Day=this.getDate()
time.TDay= time.Day<10 ?"0" time.Day:time.Day;
time.Hour=this.getHours();
time.THour=time.Hour<10?"0" 시간: 시간.시간
시간.시간=시간.시간<13?시간.시간:시간.시간-12
시간.시간=시간.시간<10?"0" 시간.시간:시간.시간 ;
time .Minute=this.getMinutes();
time.TMinute=time.Minute<10?"0" time.Minute:time.Minute;
time.Second=this.getSeconds() ;
time .TSecond=time.Second<10?"0" time.Second:time.Second;
time.Millisecond=this.getMilliseconds()
var oNumber=time.Millisecond/1000;
if( 형식!=정의되지 않음 && 형식.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.Millisecond)
.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보다 작은 경우. 두 자리 숫자는 월을 나타냅니다.
좋은 디자인은 리팩토링된다는 말이 있습니다. 이 글에서도 마찬가지입니다.
첫 번째 버전: 원본 Alert 사용
첫 번째 버전에서는 매우 게으르기 때문에 직접 Alert를 사용하여 확인합니다. 전체 코드는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.



<머리>
데모


<본문>




2012년 과 4월에 출시된 观察结果我们知道 date.toString("MM")방법이 없습니다.
  这种方式很不方便,最大的问题是它只弹出了结果,并没有给仙伦确或错误的信息,除不对代码不常熟悉,否则很难知道弹弹乓果是正是误,下face,我们写一个断言(assert)방법법来进行测试,明确给流是正是误的信息.
第二版:用assert进行检查
  断言是表达程序设计人员对于系统应该达到状态的一种预期,比如有一个方法于把两个数字加起来,对于3 2,저희는 回的结果是5,如果确实返回5那么就示,否则给流错误提示。
  断言是单测试的核心,에서 各种单元测试的框架中文提供了断言功能,这里我们写一个简单的断言(assert) 방법 :
复代码 代码如下:

function 주장(메시지,결과){
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);
}

  运行后会弹如下窗口:

第三版:进行批weight测试

  在第two版中,assert 方法可以给果,但如果想进行一정말 대단해요测试,每个测试都要进行异常捕获,还是不够方便。另외, 에서 一般的测试框架中書可以给功的个数,失败的个数,及失败的错误信息。

  为了可以方便可以到测试结果,这里我们把结果用有颜的文字显示的页face ,所以这里要写一个작은输输侓果PrintMessage :
复제대码 代码如下:

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

다음으로 jsTestDriver와 유사한 TestCase 메서드를 작성하여 일괄 테스트를 수행합니다.

코드 복사 코드는 다음과 같습니다.
function testCase(name,tests){
var SuccessCount = 0;
var testCount=0;
for(테스트의 var 테스트){
testCount
tests[test]()
PrintMessage(테스트 " 성공 " ,"#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 메소드를 제공합니다. 다음으로 testCase에 setUp 및 TearDown 메소드를 추가하겠습니다. 버전 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 및 TeaDown 메소드는 테스트에 참여하지 않으므로 testCase 코드를 수정해야 합니다.


function testCase(name,tests){
var 성공카운트=0;
var testCount=0 ;
var hasSetUp=typeof 테스트.setUp == "함수";
var hasTearDown=typeof 테스트.tearDown == "함수"; 테스트 중 테스트){
if(test ==="setUp"||test==="tearDown"){
계속
}
testCount
try{
if(hasSetUp){
tests.setUp ()
}
tests[test]()
PrintMessage(test " 성공","#080"); if(hasTearDown){
tests.tearDown ();
}

successCount ;
}
catch(e){
PrintMessage(test " failed:" message,"#800");
}
}
PrintMessage("테스트 결과: " testCount " 테스트," SuccessCount " 성공, " (testCount-successCount) " 실패","#800") ;
}


실행 후 결과는 세 번째 버전과 동일합니다.
요약 및 참고 기사

위에서 언급했듯이 좋은 디자인은 지속적인 재구성의 결과입니다. 위의 네 번째 버전은 완벽과는 거리가 멀습니다. 이 분야에 대한 지식이 필요하다면 나중에 각 테스트 프레임워크의 사용에 대해 글을 쓸 수 있습니다.

이 기사는 초보자가 JS 단위 테스트에 대한 예비 개념을 가질 수 있도록 하는 초급 수준의 예입니다. 전문가의 제안을 환영합니다.

이 글은 "Test-Driven JavaScript Development" 책의 첫 번째 장을 참조합니다(꽤 좋다고 생각합니다. 추천합니다). 책에 나오는 테스트 케이스도 시간 함수입니다. 작성하기가 더 복잡하고 초보자가 이해하기에는 적합하지 않습니다.
작성자: Artwl
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.