JavaScript에서 "어설 션"이란 무엇입니까?


263

assertJavaScript에서 무엇을 의미합니까?

나는 다음과 같은 것을 보았다 :

assert(function1() && function2() && function3(), "some text");

그리고 그 방법 assert()이 무엇인지 알고 싶습니다 .

답변:


367

assertJavaScript 에는 없습니다 (아직 추가하는 것에 대한 이야기가 있지만 초기 단계입니다). 아마도 하나를 제공하는 라이브러리를 사용하고있을 것입니다. 일반적인 의미는 함수에 전달 된 표현식이 false 인 경우 오류를 발생시키는 것입니다. 이것은 어설 션 검사 의 일반적인 개념의 일부입니다 . 일반적으로 어설 션은 "테스트"또는 "디버그"빌드에서만 사용되며 프로덕션 코드에서 제거됩니다.

항상 문자열을 받아 들여야하는 함수가 있다고 가정하십시오 . 누군가가 문자열이 아닌 것을 사용하여 해당 함수를 호출했는지 알고 싶습니다. 그래서 당신은 할 수 있습니다 :

assert(typeof argumentName === "string");

... assert조건이 거짓이면 오류가 발생합니다.

매우 간단한 버전은 다음과 같습니다.

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}

ErrorJavaScript 엔진이 지원하는 경우 (실제로 오래된 것이 아닐 수도 있음) 객체를 사용 하면 스택 추적 등을 수집 할 수있는 이점이 있습니다.

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}

IE8조차도 Error( stack속성이 없지만 현대 엔진을 포함한 최신 엔진이 있습니다).


6
... JS의 유형에 대한 화려 함? 나는 이것이 최악의 이유 중 하나라고 주장했다 assert.
cHao

137
@cHao : 유효한 사용 사례가 있습니다. 가장 먼저 떠 올랐던 예였습니다. 예는 요점이 아닙니다. 주장의 개념이 핵심입니다.
TJ Crowder 2016 년

4
내부에 코드에 추가 한 if(!condition)것은 설정 var throwError=true;debugger;던지기 섹션을에 묶습니다 if(throwError). 이렇게하면 디버거가 열려 있으면 중단되고 원하는 경우 throwErrorfalse로 설정 하고 나갈 때 모든 범위를 검사 할 수 있습니다 .
Rick

8
Chrome 개발자 도구를 사용하는 경우 @Rick을 사용하면 소스 탭에서 '포착되지 않은 예외 일시 중지'를 사용하도록 설정하면에서 자동으로 중단됩니다 throw. 그렇게하면 debugger;진술이 필요하지 않습니다 . 자세한 내용은 developer.chrome.com/devtools/docs/… 를 참조하십시오 .
Vicky Chijwani

1
@machineghost : 나는 그것이 "더 간단"하다는 것을 알지 못합니다 if. 조건 연산자 와 교환 했습니다. 어쨌든 오늘날의 세상에서 나는 엔진이없는 엔진을 지원하지 않아도 Error됩니다.
TJ Crowder 2016

157

최신 브라우저 또는 nodejs를 사용하는 경우을 사용할 수 있습니다 console.assert(expression, object).

자세한 내용은:


46
참고로, 이것은 console.error코드가 계속 실행되는 것과 더 유사 합니다.
Daniel Sokolowski

10
@DanielSokolowski, 정확합니다. console.assert와 같은 동작이 없으면 그렇게 좋지 않습니다 throw.
Pacerier

23
실행이 계속되는 이유 console.assert는 어설 션이 오류 처리 기능이 아니기 때문입니다. 개발 중에 만 코드 정확성 검사를 위해 설계되었습니다. 일반적으로 사소한 이유로 인해 라이브 시스템이 종료되는 것을 피하기 위해 프로덕션 환경에서는 완전히 비활성화되어 있습니다. 브라우저는 프로덕션 환경으로 간주되므로 console.assert실행을 종료하지 않습니다. 실행을 중지하기 위해 어설 션에 의존하는 경우 어설 션이 의도 한 것이 아니기 때문에 대신 적절한 오류 처리를 사용해야합니다.
Malvineous

8
@RonBurk : 언어 디자이너는 "어설 션의 의미"를 결정했습니다. 에서 C ++ [주장]이 프로그램의 디버깅 단계를 종료 한 후에는 일반적으로 비활성화되어 있기 때문에, 캡처 프로그래밍 오류가 아닌 사용자 또는 런타임 오류로 설계되었습니다. PHP일반적으로 어설 션 검사가 활성화되지 않은 경우 코드가 항상 올바르게 작동 할 수 있어야 한다고 말합니다 . 수동태는 개인의 선호에 권위를 부여하기위한 것이 아니라 널리 받아 들여진 일반적인 관행을보고하기위한 것이었다.
Malvineous

4
@ 돈 : 포인트를 가져 왔지만 링크 된 페이지에서 인용하고있었습니다. 언젠가 당신의 코드가 안전하다고 생각하는 누군가가 코드를 사용할 수 있기 때문에 어설 션은 비활성화 될 수있는 것처럼 취급되어야한다고 생각합니다. 어설 션이 코드에 중요하다면 실행을 종료한다고 항상 보장되지 않는 디버깅 방법에 의존하기보다는 적절한 오류 검사로 업그레이드해야한다고 생각합니다. 말할 것도없이 오류를 반환하고 계속할 수있을 때 프로덕션 환경에서 코드가 반복해서 죽게되면 가치보다 더 많은 스트레스가 발생할 수 있습니다!
Malvineous

29

다른 대답은 좋습니다. ECMAScript5에 내장 된 어설 션 기능 (예 : 기본적으로 모든 곳에서 작동하는 JavaScript)은 없지만 일부 브라우저는이 기능을 제공하거나 추가 기능을 제공합니다. 이를 위해 잘 확립 된 / 인기있는 / 유지 관리되는 라이브러리를 사용하는 것이 가장 좋지만 학문적 목적으로 "가난한 사람의 주장"기능은 다음과 같습니다.

const assert = function(condition, message) {
    if (!condition)
        throw Error('Assert failed: ' + (message || ''));
};

assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in console


BTW, 개발 환경에서 오류가 발생하도록 (예 : 다른 조건을 추가하거나 추가하면 다른 환경에 배치하여) 오류를 발생시키지 않고 경고를 인쇄하거나 아무것도 인쇄하지 않도록 쉽게 수정할 수 있습니다. 개인적으로, 주장은 테스트 코드에만 있어야한다는 것입니다 (예 : 예상 결과와 실제 결과가 일치하는지 확인). 제품 코드들은 어느 불필요한 제거 또는 그들 만이 논리 표준 예외 처리 (예를 들어 살균에 의해 대체 될 수있는 경우에 사용자 / 외부 입력 보호 작용하므로 (설계에 의한 올바른 보장)되어야하며 try, catch, throw)
iX3

8

assert()네이티브 자바 스크립트 함수가 아닙니다. 누군가가 만든 맞춤형 기능입니다. 페이지 나 파일에서 찾은 다음 다른 사람이 수행중인 작업을 확인하도록 게시해야합니다.


5

이것을 확인하십시오 : http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

JavaScript를 테스트하기위한 것입니다. 놀랍게도,이 코드는 5-6 줄에 불과하지만 테스트 할 때 코드를 강력하게 제어하고 제어 할 수 있습니다.

assert 함수는 두 가지 매개 변수를 허용합니다.

결과 : 테스트가 통과했는지 실패했는지를 나타내는 부울

설명 : 테스트에 대한 간단한 설명입니다.

assert 함수는 단순히 목록 항목을 만들고 테스트가 true 또는 false를 반환했는지 여부에 따라 "통과"또는 "실패"클래스를 적용한 다음 목록 항목에 설명을 추가합니다. 마지막으로, 해당 코드 블록이 페이지에 추가됩니다. 간단하지만 미친 듯이 작동합니다.


4

여기에 assert 함수의 간단한 구현이 있습니다. 테스트하고있는 것에 대한 가치와 설명이 필요합니다.

 function assert(value, description) {
        var result = value ? "pass" : "fail";
        console.log(result + ' - ' +  description); 
    };

값이 true로 평가되면 전달됩니다.

assert (1===1, 'testing if 1=1');  

false를 반환하면 실패합니다.

assert (1===2, 'testing if 1=1');

1
어설 션의 목적은 정보 수준에서 stdout에 로그하는 것이 아니라 프로그램 실행을 중지하고 (일반적으로 예외 발생) 어설 션이 false로 평가되면 stderr에 로그하는 것입니다.
Nuno André

4

어설 션이 false이면 메시지가 표시됩니다. 특히 첫 번째 인수가 false이면 두 번째 인수 (문자열 메시지)가 개발자 도구 콘솔에 기록됩니다. 첫 번째 인수가 참이면 기본적으로 아무 일도 일어나지 않습니다. 간단한 예 – Google 개발자 도구를 사용하고 있습니다.

var isTrue = true;
var isFalse = false;
console.assert(isTrue, 'Equals true so will NOT log to the console.');
console.assert(isFalse, 'Equals false so WILL log to the console.');

3

아마도 일부 코드에서 사용하는 테스트 라이브러리가 제공되었을 것입니다. 다음은 하나의 예입니다 (코드가 사용하는 라이브러리와 동일하지는 않지만 일반적인 아이디어를 보여줍니다).

http://chaijs.com/guide/styles/#assert


2

단어 또는 기능 "어설 션"은 대부분 응용 프로그램의 테스트 부분에 사용됩니다.

어설 션 함수는 프로그램에 조건 ( "어설 션"이라고도 함)을 확인하도록 지시하는 짧은 방법이며 조건이 True가 아닌 경우 오류가 발생합니다.

"일반 코드"에서 어떻게 보이는지 봅시다

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

assert간단히 쓸 수 있습니다 :

assert(typeof "string" === "array")

Javascript에는 기본 assert기능이 없으므로 일부 라이브러리의 기능을 사용해야합니다.

간단한 소개를 위해이 기사를 확인할 수 있습니다.

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

도움이 되길 바랍니다.


2

첫 번째 특성이 false 인 경우 어설 션에서 오류 메시지가 발생하고 두 번째 특성이 throw 될 메시지입니다.

console.assert(condition,message);

어설 션은 JavaScript에는 존재하지 않지만 JavaScript console.assert()에는 어설 션 기능 이라는 많은 의견이 있습니다. 어설 션 아이디어는 버그가 발생하는 이유 / 위치를 찾는 것입니다.

console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");

메시지에 따라 버그가 무엇인지 확인할 수 있습니다. 이 오류 메시지는 콘솔에서 console.error();
더 많은 기능을 보려면console.log(console);


1

성능과 호환성 측면에서 이전 답변을 개선 할 수 있습니다.

객체가 존재 하는지 여부를 한 번 확인하십시오 ( Error선언하지 않은 경우).

if (typeof Error === "undefined") {
    Error = function(message) {
        this.message = message;
    };
    Error.prototype.message = "";
}

그런 다음 각 어설 션은 조건을 확인하고 항상Error 개체를 던집니다.

function assert(condition, message) {
    if (!condition) throw new Error(message || "Assertion failed");
}

콘솔은 실제 오류 줄 번호를 표시하지 않지만 assert함수 줄을 표시하므로 디버깅에 유용하지 않습니다.


1

webpack을 사용하는 경우 node.js 어설 션 라이브러리 만 사용할 수 있습니다 . 그들은 그것이 "범용 어설 션 라이브러리가 아니라"고 주장하지만, 어설 션 어설 션에는 괜찮은 것 같고 어쨌든 노드 공간에 경쟁자가 존재하지 않는 것 같습니다 (카이는 유닛 테스트를 위해 설계되었습니다).

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

이를 사용하려면 webpack 또는 browserify를 사용해야하므로 분명히 워크 플로우에있는 경우에만 유용합니다.


1

console.assert 또는 롤링 과 같은 다른 옵션 외에도 불변 을 사용할 수 있습니다 . 몇 가지 고유 한 기능이 있습니다.

  • 형식 %s지정자를 사용하여 형식화 된 오류 메시지를 지원합니다 .
  • 프로덕션 환경 (Node.js 또는 Webpack 환경에 의해 결정됨)에서 오류 메시지는 선택 사항이므로 (약간) 작은 .js를 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.