[JavaScript] 자바스크립트에서의 Test Suite[JavaScript] 자바스크립트에서의 Test Suite

Posted at 2018. 12. 25. 17:15 | Posted in JavaScript & jQuery/JavaScript
반응형




■ 테스트 스위트란?



테스트 스위트의 주된 목적은 개별 테스트를 묶어 하나의  자원으로 제공함으로써

여러 테스트를 한 번에 실행할 수 있게 그리고 반복해서 간단히 실행할 수 있게 하는 것이다.




#01. 검증 조건


단위 테스트 프레임워크의 핵심은 검증 메서드로, 이 메서드의 이름은 일반적으로 assert( ) 이다.

해당 메서드는 항상 검증의 전제가  되는 표현 하나와 검증의 목적을 설명하는 인자를 받는다.

해당 표현 값이 ""이거나 "참 이 될 수 있는 값"이면 검증 조건을 통과하게 된다.

그렇지 않으면, 실패로 간주된다.

연관된 문구는 보통 성공 / 실패 표시와 함께 출력된다.

다음 코드에서 이 개념의 간단한 구현을 볼 수 있다.



# 소스 코드

 test_suite.php

<html>
  <head>
    <title>:: 테스트 스위트 ::</title>
    <script type="text/javascript">

      // assert() 메서드 정의
      function assert(value, desc) {
        var li = document.createElement("li");
        li.className = value ? "pass" : "fail";
        li.appendChild(document.createTextNode(desc));
        document.getElementById("results").appendChild(li);
      } // END function assert(value, desc)

      // 검증 조건을 이용해서 테스트 실행
      window.onload = function() {


        assert(true, "테스트 스위트 러닝");
        assert(false, "테스트 실패");
      } // END window.onload = function()
    </script>
    <style type="text/css">
      /* 결과를 출력할때 구분할 스타일 정의 */
      #results li.pass { color:#008000; }
      #results li.fail { color:#FF0000; }
    </style>
  </head>
  <body>
    <!-- 테스트 결과 수집 -->
    <ul id="results"></ul>
  </body>
</html>




# 출력 결과






#02. 테스트 그룹



간단한 검증 조건만으로도 유용하지만, 테스트 내용에 따라서 테스트를 그룹으로 묶을 때, 이는 정말로 유용해지기 시작한다.


단위 테스트에서, 하나의 테스트 그룹은 API나 애플리케이션에서 주로 어떤 한 메서드와 연관된 검증 조건들의 집합을 나타낸다.


또한 행위 주도 개발(behavior-driven development)을 한다면, 테스트 그룹은 태스크에 대한 검증 조건의 집합이 될 것이다.


어쨌거나 두 경우 모두, 테스트 그룹을 구현하는 방식은 거의 동일하다.



다음 테스트 스위트 예제는 테스트 그룹을 제공하고, 테스트 그룹 내에 포함된 각 검증 조건에 대한 결과는 results에 저장된다.


게다가 어떤 검증 조건이 하나라도 실패하면, 전체 테스크 그룹은 실패로 표시된다. 다음 코드의 결과는 꽤 간단하지만,


몇 단계의 동적 제어(테스트 그룹 내에 실패한 테스트가 있을경우, 테스트 그룹을 확장 / 축소하거나 필터링 하는것)는


실제로 매우 유용할 것이다.




# 소스 코드

 group_test_suite.php

<html>
  <head>
    <title>:: 테스트 그룹 구현 ::</title>
    <script type="text/javascript">

      // 익명 즉시 실행 함수 정의
      (function() {
        var results = "";
        this.assert = function assert(value, desc) {
          var li = document.createElement("li");
          li.className = value ? "pass" : "fail";
          li.appendChild(document.createTextNode(desc));
          results.appendChild(li);

          if(!value) {
            li.parentNode.parentNode.className = "fail";
          }

          return li;
        };

        this.test = function test(name, fn) {
          results = document.getElementById("results");
          results = assert(true, name).appendChild(document.createElement("ul"));
          fn();
        };
      })(); // (function())

      // 검증 조건을 이용해서 테스트 실행
      window.onload = function() {
        test("A test.", function() {
          assert(true, "첫번째 증명 성공");
          assert(true, "두번째 증명 성공");
          assert(true, "세번째 증명 성공");
        });

        test("B test.", function() {
          assert(true, "첫번쨰 테스트 성공");
          assert(false, "두번쨰 테스트 실패");
          assert(true, "세번쨰 테스트 성공");
        });

        test("C test.", function() {
          assert(null, "fail");
          assert(5, "pass");
        });
      } // END window.onload = function()
    </script>
    <style type="text/css">

      /* 결과를 출력할때 구분할 스타일 정의 */
      #results li.pass { color:#008000; }
      #results li.fail { color:#FF0000; }
    </style>
  </head>
  <body>
    <!-- 테스트 결과 수집 -->
    <ul id="results"></ul>
  </body>
</html>




# 출력 결과



위코드는 먼저 테스트한 test_suite.php 페이지의 assert( ) 함수의 로깅 구현과 크게 다르지 않다.


가장 큰 차이는 현재 테스트 그룹을 참조하는(검증 조건을 적절히 로깅하기 위한 수단인) results 변수를 포함하고 있느냐이다.


비동기 테스트 동작을 다루는 방식 역시 테스트 프레임워크의 중요한 측명가운데 하나다.







#03. 비동기 테스트



많은 개발자들이 자바스크립트 테스트 스위트 개발 중에 만나는 힘들고 복잡한 작업은 비동기 테스트다.


Ajax 요청이나 애니메이션처럼, 비동기 테스트는 예측할 수 없는 시간이 지난 후에야 결과를 받게 될 것이다.


비동기 테스트의 이러한 이슈를 다루는 작업은 오버엔지니어링이 되기 쉽상이고, 필요 이상으로 일을 복잡하게 만들기도 한다.


비동기 테스트를 다루려면 다음 단계를 따라야 한다.



    ① 동일한 비동기 연산에서 사용해야 한는 검증 조건은 같은 테스트 그룹으로 묶어야 한다.


    ② 각 테스트 그룹은 하나의 큐에 존재해야 하고, 이전 테스트 그룹이 모두 종료한 뒤에 실행되어야 한다.




이렇게, 각 테스트 그룹은 비 동기적으로 실행될 수 있다.




# 소스 코드

 asynchronous_test_suite.php

<html>
  <head>
    <title>:: 비동기 테스트 스위트 ::</title>
    <script type="text/javascript">

      // 익명 즉시 실행 함수 정의
      (function() {

        var queue = [];
        var paused = false, results;

        this.test = function(name, fn) {

          queue.push(function() {
            results = document.getElementById("results");
            results = assert(true, name).appendChild(document.createElement("ul"));
            fn();
          });

          runTest();
        };

        this.pause = function() {

          paused = true;
        }

        this.resume = function() {

          paused = false;
          setTimeout(runTest, 1);
        }

        function runTest() {

          if(!paused && queue.length) {
            queue.shift()();
            if(!paused) {
              resume();
            }
          }
        }

        this.assert = function assert(value, desc) {

          var li = document.createElement("li");
          li.className = value ? "pass" : "fail";
          li.appendChild(document.createTextNode(desc));
          results.appendChild(li);

          if(!value) {
            li.parentNode.parentNode.className = "fail";
          }

          return li;
        };
      })(); // END (function())

      // 검증 조건을 이용해서 테스트 실행
      window.onload = function() {

        test("비동기 테스트 #01.", function() {
          pause();
          setTimeout(function() {
            assert(true, "첫번째 테스트 성공");
            resume();
          }, 1000);
        });

        test("비동기 테스트 #02.", function() {
          pause();
          setTimeout(function() {
            assert(false, "두번째 테스트 실패");
            resume();
          }, 1000);

          test("비동기 테스트 #03.", function() {
            pause();
            setTimeout(function() {
              assert(true, "세번째 테스트 성공");
              resume();
            }, 1000);
          });
        });
      } // END window.onload = function()
    </script>
    <style type="text/css">

      /* 결과를 출력할때 구분할 스타일 정의 */
      #results li.pass { color:#008000; }
      #results li.fail { color:#FF0000; }
    </style>
  </head>
  <body>
    <!-- 테스트 결과 수집 -->
    <ul id="results"></ul>
  </body>
</html>





# 출력 결과




asynchronous_test_suite.php 페이지에는 외부에서 사용 가능한 test( ), pause( ), resume( ) 함수가 세 개가 있다.


이 세 함수는 다음 특성을 따른다.




    ① test( fn )


        -. 다수의 검증 조건을 가지고 있는 함수를 인자로 받고, 이 함수를 테스트 실행을 위한 큐에 저장한다.

        -. 함수가 가지고 있는 검증 조건은 동기나 비동기로 실행될 것이다.



    ② pause( )


        -. test( ) 함수 안에서 실행된다.

        -. 현재 테스트 그룹의 실행이 완료될 때까지, 테스트 스위트에 실행 중인 전체  테스트를 정지하라고 알려준다.



    ③ resume( )


        -. test( ) 함수를 재개하고, 이전 코드가 오래 실행되어 전체 코드가 멈추는 것을 방지하기 위해서

          잠시 동안의 딜레이를 준 다음 테스트를 실행한다.





내부적인 구현 함수는 runTest( ) 이며 테스트가 큐에 저장되거나 빠질 때 호출된다.


테스트 스위트가 현재 정지되지 않았는지를 체크하고, 큐 안에 테스트가 있다면, 테스트를 큐에서 빼서 실행을 시도한다.


게다가 테스트 그룹의 실행이 종료된 후에, runTest( )는 테스트 스위트가 현재 정지되어 있는지를 검사하고,


그렇지 않다면(테스트 그룹 안에 비동기 테스트만 실행된고 있다면),


runTest( )는 다음 테스트 그룹을 실행하기 시작한다.





반응형
//

[Ubuntu] SAMBA 파일 서버설치하고 Windows에서 접근[Ubuntu] SAMBA 파일 서버설치하고 Windows에서 접근

Posted at 2018. 12. 23. 22:45 | Posted in Linux/Ubuntu
반응형




참고 : http://www.dreamy.pe.kr/zbxe/CodeClip/163216

참고 : http://hamonikr.org/board_bFBk25/16609

참고 : http://developinghappiness.com/?p=82





■ 우분투에 삼바 파일서버 설치하고 파일 공유하기




#01. 우분투에 삼바 서버 설치




우선우분투에 삼바를 설치한다.


아래와 같이 입력하여 우분투에 삼바를 설치하자.


 $ sudo apt-get install samba

 계속 하시겠습니까? [ Y / n ] Y





삼바가 설치가 완료되었다면


다음으로 해야할일은 삼바로 접근할 계정을 생성하는것 이다.


p.s 해당부분은 생략하고 우분투 계정으로 해도 되는것으로 보여진다.


자세한건는 좀더 테스트를 하고 추후 포스팅을 수정할 예정이다.



 $ sudo smbpasswd -a wicked

 New SMB password : 

 Retype new SMB password : 





삼바의 계정 생성이 완료되었다면


이제 VIM을 사용하여 공유할 폴더를 설정한다.



 $ sudo vim /etc/samba/smb.conf




① 개인 설정

 [ 개인 폴더명 ]

 comment = 연결할 SAMBA의 설명 코멘트

 path = SAMBA로 공유할 폴더의 위치

 valid users = SAMBA로 접근할 계정명

 writable = 수정권한을 부여한다.

 guest ok = 게스트 접속 허용 여부

 create mask = SAMBA로 생성되는 파일의 권한

 directory mask = SAMBA로 생성되는 디렉토리의 권한

 hosts allow = 접속을 허용할 IP 주소 한칸 띄워쓰기를 통해 추가로 IP주소를 넣을 수 있다.

 unix charset = LINUX 내부 문자셋

 dos charsetWINDOWS의 문자셋

 display charset = 화면 출력 문자셋



② 공개 설정

 [ 공개 폴더명 ]

 comment = 연결할 SAMBA의 설명 코멘트

 path = SAMBA로 공유할 폴더의 위치

 public = 전체 공개 설정

 writable = 쓰기, 수정 여부

 write list = 읽기 전용 여부(@그룹명 : 해당 그룹은 사용 가능)

 force user = 파일 폴더 생성시 지정되는 USER 계정

 force group = 파일 폴더 생성시 지정되는 GROUP 계정






모든 설정이 완료되었다면


smb.conf 파일을 저장하고 빠져나온다음


삼바를 재실행 시켜준다.


 $ sudo service smbd restart




마지막으로 삼바에서 사용할 포트를 사용하기위해


방화벽을 해제해 주어야 한다.


 $ sudo ufw allow 137,138/udp

 $ sudo ufw allow 139,445/tcp




마지막으로 항상 재시작 해도 삼자가 자동으로 시작되게 등록해준다.

sudo systemctl enable smbd




#02. 윈도우에서 삼바로 설정한 우분투 디렉토리에 접근




아무거나 폴더를 하나 열고


상단 URL 입력 부분에 접근할 우분투 서버의 IP 주소를 입력한다.



 \\127.0.0.1


① 접근할 우분투 서버의 아이피 주소를 입력한다.

② 위에서 생성한 삼바 계정과 패스워드를 입력한다.

③ 입력이 끝나면 확인 버튼을 클릭한다.





해당 IP로의 접근이 성공되었다면.


아래 이미지와 같이 삼바의 디렉토리 경로로 설정한


폴더명이 보일것이다..









위에서 지정한 폴더로 접속하면


해당 폴더의 내용을 손쉬게 확인 및 수정 할 수 있다.


















반응형
//

[Ubuntu] MariaDB 삭제하기[Ubuntu] MariaDB 삭제하기

Posted at 2018. 12. 11. 23:47 | Posted in Linux/Ubuntu
반응형




참고 : [우분투 18.04] MariaDB apparmor 충돌 문제 해결기





■ 우분투 18.04 버전에서 마리아DB 삭제하기




우분투에서 마리아DB를 사용중 설정을 잘못하여


제하고 다시 설치해야하는 경우가 발생하였다.


그래서 검색을 통해 마리아DB를 삭제하였지만.


깨끗이 삭제되지 못한 LOG 파일등의 잔재로 마리아DB의 설치가 정상적으로 이루어 지지 못하여


검색후 아래와 같이 삭제 할 수 있었다.



필자가 접한 에러는 아래와 같다.


① mysql Cant't read dir of '/etc/mysql/conf.d/' (Errcode: 2 "No Such file or directory")

② ERROR 2002 (HY000) : Can't connect to local MYSQL server through socket '/var/run/mysqld/mysqld.sock



에러 처리를 위해서 검색중


[우분투 18.04] MariaDB apparmor 충돌 문제 해결기


위 내용을 발견하였고 다행이 마리아DB가 잘 삭제가 되었고.


해당 포스팅은 위 내용을 바탕으로 작성되었다.








# 01. MariaDB 삭제



제일먼저 마리아DB를 삭제해야 한다.


설정파일도 전부 삭제해야 하기떄문에


remove가 아니라 purge를 통해 마리아DB를 삭제한다.


 $ sudo apt-get purge mariadb-*



작업 진행중 아래와 같이 화면이 변경되는 경우가 발생할 것이다.


<예> 를 선택하여 삭제작업을 계속 진행해 나간다.







# 02. 남아 있는 의존성 패키지 자동 제거



제일먼저 해야할일은 autoremove 명령을 통해 필요없는 패키지들을 삭제한다.


 $ sudo apt autoremove




위와같이 제거를 해주었지만


그래도 살아남은 mysql 패키지들을 따로 삭제해 주기위해


dkg 명령을 사용한다.



 $ dpkg -l | grep mysql



필자의 경우 위와같이


mysql-common 하나만이 남아 있는 상태였다.

(php-mysql은 삭제하지 않는다.)


mysql-common를 직접 삭제하여 준다.


 $ sudo apt-get purge mysql-common





# 03. 시스템 재시작



마리아DB패키지 삭제가 다 이루어 졌다면


이제 우분투를 재실행 시켜 준다.








# 04. MariaDB 재설치



재실행이 완료되었다면.


이제 다시 우분투마리아DB를 설치해 보자.


 $ sudo apt-get install mariadb-server --fix-missing --fix-broken


fetch to fail 에러의 대한 대비로 --fix-missing --fix-broken 기입하였다.








참고 : Ubuntu에서 Mysql 또는 MariaDB 완전 삭제하기




■ 우분투에서 마리아DB 삭제하기




해당 방법은 이전까지 우분투에서 마리아 DB를 삭제할때 써왔던 방법이다.


필자는 우분투 18.04 버전에서 마리아 DB 삭제후


문제가 계속 발생하여 18.04 버전에서는 해당 방법으로는 해결 할 수 없었지만.


추후 문제발생의 여지를 남기지 않기위해 해당 내용도 정리해본다.



 $ sudo apt-get purge mariadb-server



<예> 를 선택하여 삭제작업을 계속 진행해 나간다.




다음으로  mysql-common 패키지도 삭제해준다.


 $ sudo apt-get purge mysql-common




마지막으로 남은 mysql 로그(LOG)파일들도 삭제한다.



 $ sudo rm -rf /var/log/mysql

 $ sudo rm -rf /var/log/mysql.*

 $ sudo rm -rf /var/lig/mysql

 $ sudo rm -rf /var/etc/mysql










반응형
//

[MariaDB] root 계정의 비밀번호 및 보안 설정 - Ubuntu[MariaDB] root 계정의 비밀번호 및 보안 설정 - Ubuntu

Posted at 2018. 12. 11. 22:33 | Posted in MySQL/MariaDB
반응형




참고 : https://github.com/helloheesu/SecretlyGreatly/wiki/맥에서-mysql-설치-후-환경설정하기





■ 우분투 마리아DB 비밀번호 및 보안 설정





우분투마리아DB 설치가 끝났다면 이제


접속할 수 있도록 관리자(root) 계정의 비밀번호 및 보안기능을 설정해 보자.



 $ sudo mysql_secure_installation




위 명령어를 실행하면 위와같이 이제 설정값을 어떻게 정할 건지 묻게된다.


아래 묻는 항목을 정리하였으니 하나하나 확인해 보며 설정을 끝마치도록 한다.









# 01. Enter current password for root



관리자(root) 계정의 현재 비밀번호를 묻는다.


비밀번호를 입력하고 ENETER 키를 누르면 된다.



그렇지만 [Ubuntu] MariaDB 설치 와 같이


마리아DB를 설치하고, $ sudo mysql_secure_jinstallation 를 통해


처음 설정하는 경우라면 ENETER를 치고  넘어가면 된다.




 Enter current password for root (enter for none): ENTER





# 02. Set root password?



관리자인 root 계정의 패스워드의 사용 여부를 묻는다.



 Set root password? [ Y / n ] Y





# 03. new password AND Re-enter new password



이제 root 계정의 비밀번호를 지정한다.



 Re-enter new password: 비밀번호






# 04. Remove anonymous users?



익명 사용자의 접속여부를 묻는다.


NO을 입력하면 $ mysql -u root 와 동시에 $ mysql도 사용이 가능하다.


되도록이면 YES를 선택하자.



 Remove anonymous users? [ Y / n ] Y






# 05. Disallow root login remotely?



127.0.0.1, localhost외에 다른 IProot 접속의 가능 여부를 묻는다.


YES를 선택하면 원격으로 root 계정의 접근을 막게된다.



 Disallow root login remotely? [ Y / n ] Y






# 06. Remove test database and access to it?



마리아DB 설치시 기본적으로 제공되는 test 데이터베이스의 삭제 여부를 묻는다.



 Remove test database and access to it? [ Y / n ] Y






# 07. Remove test database and access to it?



마지막으로 프리빌리지(privilege) 테이블의 재시작 여부를 묻는다.


YES를 선택하여 작업을 진행한다.



 Reload privilege tables now? [ Y / n ] Y










■ 우분투 마리아DB root 계정으로 접속




이제 모든 설정이 마무리 되었다면


관리자(root) 계정으로 접근할 수 있을 것이다.



 $ sudo mysql -u root -p

 Enter password: #03 에서 지정한 root 계정의 패스워드






이전글 : 우분투 마리아DB 설치하기

다음글 : 우분투에서 마리아DB 원격접속 설정하기




반응형
//