분류 javascript

?? ? 포괄적이고 철저한 JavaScript 및 Node.js 테스트 모범 사례 (2019 년 8 월)

컨텐츠 정보

  • 조회 180 (작성일 )

본문

?이 안내서가 테스트 기술을 다음 단계로 끌어 올리는 이유 


45 가지 이상의 모범 사례 : 포괄적이고 철저한 


A-Z의 JavaScript 및 Node.js 안정성에 대한 안내서입니다. 시장에서 제공하는 수십 가지 최고의 블로그 게시물, 서적 및 도구를 요약하고 정리합니다.


? 고급 : 기본을 뛰어 넘는 10,000 마일 


생산 테스트, 돌연변이 테스트, 속성 기반 테스트 및 기타 여러 전략적 및 전문 도구와 같은 고급 주제로 넘어가는 여정을 경험하십시오. 이 안내서의 모든 단어를 읽으면 테스트 기술이 평균보다 높아질 수 있습니다.


? 풀 스택 : 프론트, 백엔드, CI, 무엇이든 


모든 응용 프로그램 계층의 기초가 되는 유비쿼터스 테스트 방법을 이해하는 것으로 시작하십시오. 그런 다음 프런트 엔드 / UI, 백엔드, CI 또는 모두를 선택하여 원하는 영역을 조사하십시오.


https://github.com/goldbergyoni/javascript-testing-best-practices 



Section 0️⃣ : 황금률 


⚪️ 0. 황금률 : 린 테스트를 위한 디자인 


✅해야 할 일 : 테스트 코드는 프로덕션 코드와는 다릅니다. 코드가 단순하고, 짧고, 추상화가 없고, 평평하며, 작업하기에 좋고, 간결합니다. 테스트를 보고 즉시 의도를 가져와야 합니다.


우리의 마음은 주요 생산 코드로 가득 차 있으며 추가 복잡성을 위한 '헤드 스페이스'가 없습니다. 우리가 열악한 두뇌에 또 다른 도전적인 코드를 짜내려고 시도하면 팀이 느려지고 테스트하는 이유에 맞서 작동합니다. 실제로 이것은 많은 팀이 테스트를 포기한 곳입니다.


테스트는 친절하고 웃는 조수와 같은 다른 일을 할 수 있는 기회입니다. 과학은 우리에게 두 가지 뇌 시스템이 있다고 말합니다. 빈 도로에서 자동차를 운전하는 것과 같은 수고를 더는 활동에 사용되는 시스템 1과 수학 방정식을 푸는 것과 같이 복잡하고 의식적인 작업을 위한 시스템 2입니다. 테스트 코드를 볼 때 시스템 1에 맞게 테스트를 디자인하면 HTML 문서를 수정하는 것만 큼 쉬워야 하며 2X (17 × 24)를 해결하는 것이 좋습니다.


이는 비용 효율적이고 뛰어난 ROI를 제공하는 선택 체리 선택 기법, 도구 및 테스트 대상을 통해 달성 할 수 있습니다. 필요한 만큼만 테스트하고, 민첩하게 유지하려고 노력하십시오. 때로는 테스트를 포기하고 민첩성과 단순성을 위해 신뢰성을 거래 할 가치가 있습니다.


alt text 

아래의 대부분의 조언은 이 원칙의 파생물입니다.


섹션 1. 테스트 해부 


⚪ 1.1 1.1 각 시험 명에 3 개의 부품을 포함 


✅해야 할 일 : 테스트 보고서는 현재 애플리케이션 개정이 코드에 익숙하지 않은 사람들 (테스터, 배포중인 DevOps 엔지니어 및 향후 2 년)에 대한 요구 사항을 충족하는지 여부를 알려야 합니다. 테스트가 요구 사항 수준에서 말하고 3 가지 부분을 포함하는 경우 가장 잘 달성 할 수 있습니다.


(1) 무엇을 테스트하고 있습니까? 예를 들어 ProductsService.addNewProduct 메소드


(2) 어떤 상황과 시나리오에서? 예를 들어, 메소드에 가격이 전달되지 않습니다


(3) 예상되는 결과는 무엇입니까? 예를 들어, 새 제품이 승인되지 않았습니다


❌ 그렇지 않으면 : 배포가 실패하고 "제품 추가"라는 테스트에 실패했습니다. 이것이 정확히 무엇이 오작동 하는지 알려줍니까?


? 참고 : 각 글 머리 기호에는 코드 예제가 있으며 때로는 이미지 그림도 있습니다. 


✏ 코드 예

? 올바른 일 예 : 세 부분으로 구성된 테스트 이름 

//1. unit under test
describe('Products Service', function() {
  describe('Add new product', function() {
    //2. scenario and 3. expectation
    it('When no price is specified, then the product status is pending approval', ()=> {
      const newProduct = new ProductService().add(...);
      expect(newProduct.status).to.equal('pendingApproval');
    });
  });
});


? 올바른 일 예 : 세 부분으로 구성된 테스트 이름 


alt text 


⚪1.2 AAA 패턴에 의한 구조 시험 


✅해야 할 것 : 3 개의 잘 정리 된 섹션 AAA (Arrange, Act & Assert)로 테스트를 구성하십시오. 이 구조를 따르면 독자는 테스트 계획을 이해하는 데 뇌 CPU를 소비하지 않습니다.


1st A-Arrange : 테스트를 목표로 하는 시나리오로 시스템을 가져 오는 모든 설정 코드. 여기에는 테스트 생성자의 단위 인스턴스화, DB 레코드 추가, 객체에 대한 조롱 / 스터빙 및 기타 준비 코드가 포함될 수 있습니다.


2nd A-Act : 테스트중인 장치를 실행합니다. 일반적으로 한 줄의 코드


3rd A-Assert : 수신 된 값이 기대치를 충족하는지 확인하십시오. 일반적으로 한 줄의 코드


❌ 그렇지 않으면 : 당신은 주요 코드를 이해하는 데 매일 많은 시간을 할애 할 뿐만 아니라 이제는 하루 중 간단한 부분 (테스트)이 두뇌를 확장시킵니다.


✏ 코드 예

? 올바른 일 예 : AAA 패턴으로 구성된 테스트 


describe('Customer classifier', () => {
    test('When customer spent more than 500$, should be classified as premium', () => {
        //Arrange
        const customerToClassify = {spent:505, joined: new Date(), id:1}
        const DBStub = sinon.stub(dataAccess, "getCustomer")
            .reply({id:1, classification: 'regular'});

        //Act
        const receivedClassification = customerClassifier.classifyCustomer(customerToClassify);

        //Assert
        expect(receivedClassification).toMatch('premium');
    });
});


? Pattern 안티 패턴 예 : 분리가없고 한 벌크이며 해석하기가 더 어렵다 


test('Should be classified as premium', () => {
        const customerToClassify = {spent:505, joined: new Date(), id:1}
        const DBStub = sinon.stub(dataAccess, "getCustomer")
            .reply({id:1, classification: 'regular'});
        const receivedClassification = customerClassifier.classifyCustomer(customerToClassify);
        expect(receivedClassification).toMatch('premium');
    });