숨겨진 Windows 7 프로세스. 바이러스 프로세스를 찾아서 제거하는 방법은 무엇입니까? "왼쪽" 프로세스를 결정하는 것이 가능합니까?

공식 jQuery 테스트 도구입니다. 그러나 QUnit은 JavaScript 코드를 테스트하는 데 적합하며 Rhino 또는 V8과 같은 엔진을 사용하여 JavaScript 백엔드를 테스트할 수도 있습니다.

"단위 테스트" 개념에 익숙하지 않더라도 걱정하지 마세요. 복잡한 것은 없습니다.

"단위 테스트 또는 단위 테스트(영어) 단위 테스트)은 프로그램 소스 코드의 개별 모듈이 올바른지 확인할 수 있는 프로그래밍 프로세스입니다. 아이디어는 모든 중요하지 않은 함수나 메서드에 대한 테스트를 작성하는 것입니다. 이를 통해 다음 코드 변경으로 인해 다음이 발생했는지 신속하게 확인할 수 있습니다. 회귀즉, 프로그램의 이미 테스트된 위치에 오류가 나타나는지 확인하고 이러한 오류를 쉽게 감지하고 제거할 수 있습니다."

Wikipedia에서 인용된 정의입니다. 코드의 각 기능 블록에 대해 테스트를 수행하고 모든 테스트가 통과하면 오류가 없는지 확인할 수 있습니다(주로 테스트가 얼마나 신중하게 설계되었는지에 따라 다름).

코드를 테스트해야 하는 이유

이전에 단위 테스트를 작성한 적이 없다면 웹 서버에서 직접 코드를 호스팅하고 실행하고 오류를 관찰하고 발견된 대로 수정하려고 시도했을 것입니다. 이러한 작업 방식은 많은 문제를 야기합니다.

첫째, 이것은 매우 지루하고 지루한 활동입니다. 유효성 검사는 실제로 모든 항목이 눌렸는지 확인해야 하기 때문에 꽤 어려운 작업입니다. 그리고 이 과정에서 한두 가지 포인트를 놓칠 확률이 매우 높다.

둘째, 이러한 테스트를 위해 수행된 모든 작업은 재사용할 수 없습니다. 이 방법을 사용하면 회귀를 찾는 것이 매우 어렵습니다. 회귀란 무엇입니까? 일부 코드를 작성하고 테스트한 후 발견한 모든 오류를 수정하고 사이트에 코드를 배치했다고 상상해 보세요. 그런 다음 사용자는 새로운 버그에 대한 피드백과 새로운 기능에 대한 요청을 보냈습니다. 코드로 돌아가서 버그를 수정하고 새로운 기능을 추가합니다. 이 경우 이전 오류가 다시 나타나는 상황이 발생할 수 있는데, 이를 "회귀"라고 합니다. 모든 것을 다시 확인해야 합니다. 그리고 오래된 실수를 찾지 못할 가능성이 있습니다. 어쨌든 문제가 '회귀'로 인해 발생했다는 사실을 깨닫는 데는 시간이 걸립니다. 단위 테스트를 사용할 때는 테스트를 작성합니다. 코드가 수정되면 테스트를 통해 다시 필터링합니다. 회귀가 발생하면 일부 테스트가 실패하게 되며 코드의 어느 부분에 오류가 포함되어 있는지 쉽게 확인할 수 있습니다. 무엇을 변경했는지 알고 있으므로 오류를 쉽게 수정할 수 있습니다.

단위 테스트(특히 웹 개발의 경우)의 또 다른 장점은 브라우저 간 호환성을 테스트하기 쉽다는 것입니다. 다양한 브라우저에서 테스트를 실행하기만 하면 됩니다. 브라우저에서 문제가 발견되면 문제를 수정하고 테스트를 다시 실행할 수 있습니다. 결과적으로 모든 대상 브라우저가 모두 테스트되었으므로 모든 대상 브라우저가 지원된다는 것을 확신할 수 있습니다.

QUnit에서 단위 테스트를 작성하는 방법

그렇다면 QUnit에서 단위 테스트를 어떻게 직접 작성합니까? 첫 번째 단계는 테스트 환경을 설치하는 것입니다.

QUnit 테스트 스위트 QUnit 테스트 스위트

테스트할 코드는 myProject.js 파일로 이동하고 테스트는 myTests.js로 이동합니다. 테스트를 실행하려면 브라우저에서 HTML 파일을 열면 됩니다. 이제 몇 가지 테스트를 작성할 시간입니다.

단위 테스트의 구성 요소는 어설션입니다.

"어설션은 코드가 실행될 때 반환 결과를 예측하는 표현식입니다. 예측이 잘못된 경우 어설션은 값을 갖습니다. 거짓이를 통해 오류가 있는지 결론을 내릴 수 있습니다."

어설션을 실행하려면 테스트 블록에 배치해야 합니다.

// 이 함수 테스트 function isEven(val) ( return val % 2 === 0; ) test("isEven()", function() ( ok(isEven(0), "0은 짝수입니다."); ok ( isEven(2), "2도 마찬가지입니다."); ok(isEven(-4), "그리고 음수 4도 짝수입니다.") ok(!isEven(1), "1은 홀수입니다."); isEven(-7), "-7과 마찬가지로 홀수입니다.");

여기서 우리는 함수를 정의합니다 짝수이다, 이는 숫자의 패리티를 확인하며 이 함수가 잘못된 값을 반환하지 않는지 확인하고 싶습니다.

먼저 함수를 호출합니다. 시험(), 테스트 블록을 구축합니다. 첫 번째 매개변수는 결과로 출력될 문자열입니다. 두 번째 매개변수는 우리의 주장을 포함하는 반환 함수입니다. 이 콜백 함수는 QUnit 실행 중에 한 번 호출됩니다.

우리는 다섯 가지 진술을 작성했는데, 모두 논리적입니다. 논리문에서는 첫 번째 매개변수에 값이 있다고 가정합니다. 진실. 두 번째 매개변수는 결과에 표시되는 메시지입니다.

테스트를 실행한 후 얻은 결과는 다음과 같습니다.

모든 진술이 성공적으로 확인되었으므로 기능이 다음과 같다고 가정할 수 있습니다. 짝수이다()예상대로 작동합니다.

만약 그 진술이 거짓이라면 어떻게 되는지 봅시다.

// 이 함수 테스트 function isEven(val) ( return val % 2 === 0; ) test("isEven()", function() ( ok(isEven(0), "0은 짝수입니다."); ok ( isEven(2), "2도 마찬가지입니다."); ok(isEven(-4), "그리고 음수 4도 짝수입니다.") ok(!isEven(1), "1은 홀수입니다."); isEven(-7), "음수 7은 홀수입니다."); // Error ok(isEven(3), "3은 짝수입니다.");

테스트를 실행한 결과 다음과 같은 결과를 얻었습니다.


성명서에는 저희가 의도적으로 만든 오류가 있습니다. 그러나 프로젝트에서 일부 테스트가 실패하고 다른 모든 설명이 정확하다면 오류를 찾는 것은 매우 쉽습니다.

기타 진술

ok()는 QUnit이 지원하는 유일한 명령문이 아닙니다. 프로젝트에 대한 테스트를 작성할 때 사용하는 데 유용한 다른 유형의 어설션이 있습니다.

비교 진술

비교 진술 같음()첫 번째 매개변수(실제 값)가 두 번째 매개변수(예상 값)와 동일하다고 가정합니다. 이 진술은 다음과 매우 유사합니다. 좋아요(), 그러나 실제 값과 예상 값을 모두 출력하므로 코드 디버깅이 훨씬 쉬워집니다. 게다가 좋아요(), 같음()출력할 메시지를 세 번째 매개변수로 받아들일 수 있습니다.

그래서 대신에

Test("어설션", function() ( ok(1 == 1, "하나는 하나와 같습니다"); ))


사용되어야한다:

Test("어설션", function() ( equals(1, 1, "하나는 하나와 같습니다."); ))


예상 값은 줄 끝에 인쇄됩니다.

값이 동일하지 않은 경우:

Test("어설션", function() ( equals(2, 1, "하나는 하나와 같습니다"); ))


이 항목은 더 많은 정보를 제공합니다.

비교 어설션은 "==" 연산자를 사용하여 매개변수를 테스트하므로 배열이나 객체에서는 작동할 수 없습니다.

Test("테스트", function() ( equals((), (), "오류, 이들은 서로 다른 개체입니다."); equals((a: 1), (a: 1) , "error"); equals(, , "오류입니다. 배열이 다릅니다."); equals(, , "error");

이러한 경우 QUnit에는 ID 주장이 있습니다.

신원 확인

신원 확인 같은()와 동일한 매개변수를 사용합니다. 같음(), 그러나 기본 유형뿐만 아니라 배열 및 객체에서도 작동합니다. 이전 예의 명령문이 ID 명령문으로 변경되면 테스트를 통과합니다.

Test("테스트", function() ( same((), (), "통과, 객체의 내용이 동일함"); same((a: 1), (a: 1) , "통과"); same( , , "통과합니다. 배열의 내용이 동일합니다.") same(, , "통과합니다");

점에 유의하시기 바랍니다 같은()비교를 위해 '===' 연산자를 사용하므로 특수한 값을 비교할 때 사용하면 편리합니다.

Test("테스트", function() ( 같음(0, false, "true"); same(0, false, "false"); equals(null, 정의되지 않음, "true"); same(null, 정의되지 않음, " 거짓"); ))

명령문 구조

모든 단언을 하나의 테스트에 두는 것은 매우 나쁜 생각입니다. 이러한 테스트는 유지 관리가 어려우며 실행 결과를 평가하는 데 혼란을 겪을 수 있습니다. 따라서 각 블록은 특정 기능 그룹을 목표로 하는 별도의 블록에 명령문을 배치하여 테스트를 구성해야 합니다.

함수 호출을 사용하여 개별 모듈을 구성할 수 있습니다. 기준 치수:

Module("모듈 A"); test("테스트", function() ()); test("또 다른 테스트", function() ()); module("모듈 B"); test("테스트", function() ()); test("또 다른 테스트", function() ());


이전 예에서는 모든 문이 동기적으로 호출되었습니다. 즉, 차례로 실행되었습니다. 현실 세계에는 AJAX 요청이나 함수와 같은 비동기 함수가 많이 있습니다. 세트타임아웃()그리고 세트간격(). 이러한 유형의 기능을 어떻게 테스트합니까? QUnit에는 비동기 테스트용으로 설계된 "비동기 테스트"라는 특수 테스트 유형이 있습니다.

먼저 일반적인 방법으로 테스트를 작성해 보겠습니다.

Test("비동기 테스트", function() ( setTimeout(function() ( ok(true); ), 100) ))


테스트에는 아무런 주장도 없는 것 같습니다. 명령문이 동기적으로 실행되었기 때문에 함수가 호출될 때쯤에는 테스트가 이미 완료되었습니다.

예제를 테스트하는 올바른 방법은 다음과 같습니다.

Test("비동기 테스트", function() ( // 테스트를 일시 중지 모드로 전환 stop(); setTimeout(function() ( ok(true); // 어설션을 호출한 후 // 테스트 계속 start(); ) , 100) ))


우리는 기능을 사용했습니다 멈추다()테스트를 중지하고 어설션을 실행한 후 함수를 사용하여 테스트를 다시 실행합니다. 시작().

함수 호출 멈추다()함수 호출 직후 시험()매우 일반적인 관행입니다. 이것이 바로 QUnit에 특별한 약어가 있는 이유입니다: 비동기테스트(). 이전 예는 다음과 같이 다시 작성할 수 있습니다.

AsyncTest("비동기 테스트", function() ( // 테스트는 자동으로 "일시 중지" 모드로 전환됩니다. setTimeout(function() ( ok(true); // 어설션을 호출한 후 // 테스트 계속 start(); ) , 100) ) )

생각해 볼 만한 한 가지 사항이 있습니다. 바로 함수입니다. 세트타임아웃()항상 콜백 함수를 호출하며, 다른 함수(예: AJAX 호출)를 테스트하는 경우에도 마찬가지입니다. 콜백 함수가 호출될 것이라고 어떻게 확신할 수 있나요? 반환 함수가 호출되지 않으면 함수는 시작()또한 호출되지 않은 상태로 유지되며 전체 테스트가 정지됩니다.


다음과 같이 테스트를 구성할 수 있습니다.

// 사용자 정의 함수 function ajax(successCallback) ( $.ajax(( url: "server.php", Success: SuccessCallback )); ) test("Asynchronous test", function() ( // 테스트 중지 및 // 보고 1초 후에 start() 함수가 호출되지 않으면 오류 stop(1000); ajax(function() ( // ...비동기 명령문 start(); )) ))

기능하려면 멈추다()시간 초과 값이 전송됩니다. 이제 QUnit은 "만약 함수가 시작()제한 시간이 만료된 후에는 호출되지 않으므로 이 테스트는 실패한 것으로 간주되어야 합니다." 이제 전체 테스트가 중단되지 않고 문제가 발생하면 경고가 표시됩니다.

이제 여러 비동기 함수의 경우를 고려해보세요. 함수를 배치할 위치 시작()? 함수에 배치해야합니다 세트타임아웃():

// 사용자 정의 함수 function ajax(successCallback) ( $.ajax(( url: "server.php", Success: SuccessCallback )); ) test("Async test", function() ( // 테스트 중지 stop(); ajax (function() ( // ...비동기 문 )) ajax(function() ( // ...비동기 문 )) setTimeout(function() ( start(); ), 2000 ));

시간 초과 값은 테스트가 계속되기 전에 두 콜백이 모두 완료될 수 있을 만큼 충분해야 합니다. 함수 중 하나가 호출되지 않으면 어떤 함수인지 어떻게 확인할 수 있습니까? 이에 대한 기능이 있습니다 예상하다():

// 사용자 정의 함수 function ajax(successCallback) ( $.ajax(( url: "server.php", Success: SuccessCallback )); ) test("Asynchronous test", function() ( // 테스트 중지 stop(); / / 세 개의 명령문이 실행될 것으로 예상한다고 QUnit에 알립니다. ajax(function() ( ok(true); )) ajax(function() ( ok(true); ok(true); )) setTimeout( 함수( ) ( 시작(); ), 2000 ))

우리는 함수에 전달합니다 예상하다()실행될 예정인 문의 수입니다. 명령문 중 하나가 실패하면 계획대로 진행되지 않는다는 메시지를 받게 됩니다.

사용할 수 있는 짧은 녹음 파일이 있습니다. 예상하다(): 두 번째 파라미터로 예약된 문의 개수를 전달해야 합니다. 시험()또는 비동기테스트():

// 사용자 정의 함수 function ajax(successCallback) ( $.ajax(( url: "server.php", Success: SuccessCallback )); ) // QUnit에게 3개의 문이 실행될 것으로 예상한다고 알립니다. test("asynchronous test", 3 , function() ( // 테스트 중지 stop(); ajax(function() ( ok(true); )) ajax(function() ( ok(true); ok(true); )) setTimeout(function() ( 시작 (); 2000);

결론

이 튜토리얼에서는 QUnit을 시작하는 데 필요한 모든 것을 제공했습니다. 단위 테스트는 코드를 사용하기 전에 테스트하는 훌륭한 방법입니다. 이전에 테스트를 사용해 본 적이 없다면 지금이 시작할 때입니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: