Tech/JavaScript2017. 11. 10. 12:31

Javascript Unit Test를 수행하기 위해 Mocha, Jasmine, Qunit 중에 검토하다가 비교적 가장 최신 기술이고, Mock을 쓰기 편한 쪽이라 추측하여, Mocha의 사용법을 알아보았다. (Unit Test를 작성할 때, BDD, TDD 두 가지 스타일을 모두 제공한다는 점에서도 끌렸다.)


설치

  1. chai를 설치한다.

    npm install -g chai
    (or npm install chai --save-dev)
  2. mocha를 설치한다.

    npm install -g mocha



BDD Unit Test

  1. 모듈을 작성한다. (app.js)

    (function(exports) {
      "use strict";
     
      function Tester() {}
      exports.Tester = Tester;
     
      Tester.prototype = {
        sum: function (a, b) {
          return a + b;
        }
      };
    })(this);



  2. 테스트 코드를 작성한다. (app.test.js)

    var expect = chai.expect;
     
    describe("BDD Test"function() {
      describe("더하기 테스트"function() {
        it("2와 4를 합했으니, 6이 될 것이다."function() {
          var tester = new Tester();
          expect(tester.sum(2, 4)).to.equal(6);
        });
      });
    });



  3. 테스트를 수행 결과를 표시하기 위한 html을 작성한다. (index.html)

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>BDD unit test</title>
      <!-- mocha 스타일 적용 -->
      <link rel="stylesheet" media="all" href="../component/mocha/mocha.css">
    </head>
    <body>
      <div id="mocha"><p><a href=".">Index</a></p></div>
      <div id="messages"></div>
      <div id="fixtures"></div>
      <!-- mocha.js 로드 -->
      <script src="../component/mocha/mocha.js"></script>
      <!-- chai.js 로드 -->
      <script src="../component/chai/chai.js"></script>
      <script src="app.js"></script>
      <!-- bdd 스타일 UnitTest임을 설정함 -->
      <script>mocha.setup('bdd')</script>
      <script src="app.test.js"></script>
      <!-- UnitTest 수행 -->
      <script>mocha.run();</script>
    </body>
    </html>



  4. html을 실행시켜본다.

    1. 성공했을 때
    2. 실패했을 때

 

 

Command Line Test

  1. 모듈을 작성한다. (app.js)

    module.exports = {
      sum: function(a,b) {
        return a+b;
      }
    }



  2. 테스트 코드를 작성한다. (app.test.js)

    var chai = require('chai');
    var assert = chai.assert;
    var app = require('../app.js');
     
    describe('Sum Test'function() {
      it("1과 2를 더하면, 3이 될 것이다."function() {
        assert.equal(3, app.sum(1,2));
      });
    });



  3. Command Line으로 결과를 확인한다.

     

MockTest

  1. Sinon.JS를 다운로드 받는다. (사이트 주소 : http://sinonjs.org/)
    1. Document : http://sinonjs.org/docs/
    2. 참고 사이트 : http://elijahmanor.com/unit-test-like-a-secret-agent-with-sinon-js/
       
  2. 다운로드 받은 sinon.js를 추가한다. (index.html)

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>BDD unit test</title>
      <!-- mocha 스타일 적용 -->
      <link rel="stylesheet" media="all" href="../component/mocha/mocha.css">
    </head>
    <body>
      <div id="mocha"><p><a href=".">Index</a></p></div>
      <div id="messages"></div>
      <div id="fixtures"></div>
      <!-- mocha.js 로드 -->
      <script src="../component/mocha/mocha.js"></script>
      <!-- chai.js 로드 -->
      <script src="../component/chai/chai.js"></script>
      <!-- sinon.js 로드 -->
      <script src="../component/sinon/sinon-1.17.3.js"></script>
      <script src="app.js"></script>
      <!-- bdd 스타일 UnitTest임을 설정함 -->
      <script>mocha.setup('bdd')</script>
      <script src="app.test.js"></script>
      <!-- UnitTest 수행 -->
      <script>mocha.run();</script>
    </body>
    </html>



  3. 테스트를 위한 클래스를 정의한다. (person.js)

    (function(exports) {
      "use strict";
     
      function Person() {}
      exports.Person = Person;
     
      Person.prototype = {
        setName: function(name) {
          this.name = this.returnName(name);
        },
        returnName: function(name) {
          return name;
        }
      };
    })(this);



  4. Mock Test 코드를 작성한다. (person.test.js)
    (tick) "setName" 함수를 호출했을 때, "returnName" 함수를 호출하는지 확인한다.

    var expect = chai.expect;
     
    describe("Person"function() {
      describe("constructor"function() {
        it("Mock Test"function() {
          var person = new Person();
          var mock = sinon.mock(person);
     
          mock.expects("returnName").once().withExactArgs("Betty");
          person.setName("Betty");
     
          mock.verify();
          mock.restore();
        });
      });
    });



  5. 결과를 확인한다.



'Tech > JavaScript' 카테고리의 다른 글

Javascript Task Runner : Grunt 의 개요 및 장점  (0) 2015.06.05
Posted by 알 수 없는 사용자
Tech/Android 개발2015. 7. 9. 18:29

Android Studio에서 Junit 기반 단위 테스트(Unit Test) 환경 구축하기

안드로이드 Instrumentation 테스트의 경우에는 안드로이드 장치 또는 시뮬레이터에 직접 테스트 코드를 올려서 테스트가 진행됩니다. 이러한 과정 때문에 비교적 느립니다. 다른 방식으로 데스크탑 환경에서도 테스트를 할 수 있습니다. 이 방식에서는 보통 Junit을 기반으로 다양한 Mocking 라이브러리 또는 Robolectric과 같은 프레임워크를 사용하여 테스트가 진행됩니다. 이 포스트에서는 이런 방식의 가장 기본이 되는 Junit 테스트 환경을 구축하는 방법에 대해 설명하겠습니다.


진행환경

* Window 8.1  /  * Android Studio 1.2.2


1. 프로젝트 생성

Blank Activity 프로젝트를 기본 옵션으로 하나 생성합니다.


2. Unit Test 폴더 구조 생성

안드로이드에서 Instrumentation 테스트의 경우는 src/androidTest/java를, Junit 테스트의 경우에는 src/test/java를 기본 테스트 폴더로 인식합니다. 

프로젝트를 생성하시면 기본적으로 androidTest 폴더가 생성되어있을 것입니다. 상단 좌측의 프로젝트 구조 보기를 'Project'로 선택하시고 androidTest폴더에서 우클릭 -> Refactor -> Rename 을 통해 test로 이름을 변경하면 됩니다.


3. 빌드 스크립트에 Junit 추가

app의 build.gradle 파일을 열어서 dependency에 testCompile 구문을 추가합니다.

dependencies {
  ...
  testCompile 'junit:junit:4.12'
  ...
} 

메뉴에서 Tools -> Android -> Sync Project with Gradle Files 를 선택해 Gradle 파일을 Sync 시켜 줍니다.


4. Test Artifact 설정

좌측 하단 Build Variant 탭을 클릭한 후 Test Artifact를 Unit Tests로 설정해 줍니다.

여기까지 하시면 안드로이드가 java 폴더를 테스트 폴더로 인식하여 첫번째 사진과 같이 초록색 아이콘 으로 표시되어야 합니다.


5. Unit Test 코드 작성

이제 환결 설정은 다 끝났습니다! 작동하는지 알아보기 위해 간단히 Calculator 클래스를 만들어서 두 정수를 더하는 메소드를 테스트 해보겠습니다.

아래와 같이 Calculator랑 CalculatorTest 클래스를 생성하고 코드를 써줍니다.

 Calculator.java

CalculatorTest.java 

public class Calculator {
  public int add(int a, int b) {
    return a+b;
  }
}

import org.junit.Test;
import static org.junit.Assert.assertTrue;

public class CalculatorTest {
  @Test
  public void testAdd() {
    Calculator calculator = new Calculator(); 
    int actual = calculator.add(10, 10); 
    int expected  = 10+10;
    assertTrue(actual == expected);
  }
}


6. 테스트하기

테스트 java 폴더에서 우클릭 -> Run -> All Tests를 통해 테스트를 실행할 수 있습니다. 성공하면 아래와 같은 결과가 나옵니다.

끝!


참조

https://developer.android.com/training/testing/unit-testing/local-unit-tests.html
http://tools.android.com/tech-docs/unit-testing-support


'Tech > Android 개발' 카테고리의 다른 글

Android에서 SignalR 사용하기  (0) 2015.06.19
안드로이드에서의 HLS 스트리밍 이슈들  (0) 2015.04.13
Android 개발환경 설정  (0) 2011.04.15
Posted by 알 수 없는 사용자