Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Robot framework 을 이용한 기능 테스트 자동화

4,361 views

Published on

RobotFramework, Selenium 을 이용한 Web Application Test 자동화

Published in: Software

Robot framework 을 이용한 기능 테스트 자동화

  1. 1. 1 RobotFramework 를 이용한 기능 테스트 자동화 오재훈 (주)넷스루 연구소장 ( 이메일 : jaehoon@nethru.co.kr, ojh420@gmail.com, 페이스북: https://www.facebook.com/jaehoon.oh.503 )
  2. 2. 2 소프트웨어를 빈번하게 출시해야 하는 상황에서도 높은 품질의 소프트웨어를 유지하기 위한 방법들을 소개한다. RobotFramework 를 이용한 레거시 시스템의 테스트 자동화 방법, 개발 초기부터 테스트를 자동화하는 인수테스트 주도 개발방법을 워크샾을 통해 몸에 익힌다. 테스트 자동화에 필요한 지식과 경험을 통해서 테스트 자동화를 현업에 적용하는 시발점을 제공한다. 이 자료의 목표 교육 목표 - 테스트 자동화의 개념을 이해하고, QA(테스트 엔지니어)가 해야할 역할과 책임을 파악한다. - 테스트 자동화 프레임워크인 RobotFramework 를 이용해서 자동화된 테스트를 작성할 수 있다. - 인수테스트 주도개발 방법으로 프로그래머와 협력하는 방법을 경험한다. - 테스트 자동화를 점진적으로 개선하기 위한 다양한 방법과 경험들을 함께 만들고 공유한다. 개요 및 목표 2
  3. 3. 3 Contents Ⅱ. RobotFramework Ⅳ. Commad Line Options Ⅰ. SW 테스트 자동화 Ⅲ. Web Application Test
  4. 4. 4 SW 테스트 자동화 1. SW 테스트 2. SW 테스트 자동화 3. SW 테스트 종류와 자동화
  5. 5. 5 ● 요구사항을 언제 전달받나요? ● 요구사항의 의미를 이해하고 파악하는 방법은 무엇인가요? ● 테스트 케이스를 언제 설계하나요? ● 테스트 대상 시스템은 언제 전달받나요? ● 테스트 대상 시스템을 전달 받은 후, 도출된 결함후보를 언제 어떻게 전달하나요? ● 결함 후도들의 결함여부를 어떻게 결정하나요? ● 결함이 수정된 버전을 받는데 얼마나 많은 시간이 걸리나요? ● 개발팀과 언제 어떻게 소통하나요? ● 제품을 얼마나 자주 출시하니요? (출시 주기) ● 테스트를 얼마나 자주 반복하나요? ● 자동화된 테스트가 있나요? ● 자동화된 테스트가 있다면, 테스트 자동화 비중은 얼마나 되나요? SW 테스트 테스팅 경험
  6. 6. 6 전통적인 소프트웨어 테스트에서 어떤 문제들을 겪는가? SW 테스트
  7. 7. 7 V&V 모델
  8. 8. 8 전통적인 SW 테스트에서 발생하는 문제들 ● 개발 결과에 대한 피드백 주기가 길다. ● 잘못 개발했다는 것을 너무 늦게 안다. ● 개발자와 테스터가 요구사항을 다르게 이해하는 현상이 발생한다. ● 개발내용이 요구사항에 부합하지 않는다는 사실을 프로젝트 막바지에 발견한다. ● 개발자-테스터간 협력이 일어나지 않는다. ● 개발자-테스터가 서로를 비난하거나 비판한다. ● ... SW 테스트
  9. 9. 9 소프트웨어 테스트 자동화가 왜 필요한가요? 테스트 자동화
  10. 10. 10 테스트 자동화 왜 해야 하나?
  11. 11. 11 ● 소프트웨어를 자주 출시해서 자주 테스트해야 한다. ( 1개월/1주일/매일 ) ● 수작업 테스트는 너무 오래 걸린다. ● 수작업 테스트를 수행하면 실수가 생긴다. ● 테스트를 자동화하면 사람은 본연의 개발 업무에 더 집중할 수 있다. ● 회귀테스트가 자동화되면 좀 더 안전하다. ● 자동화된 테스트는 더 자주, 더 많이 피드백을 준다. ● 테스트 자체가 훌륭한 문서다. ● ... 테스트 자동화 왜 해야 하나?
  12. 12. 12 무엇을 얼마나 자동화 해야 하나? 테스트 자동화의 장애물
  13. 13. 13 테스트 피라미드
  14. 14. 14 무엇이 테스트 자동화를 방해하는가? 테스트 자동화의 장애물
  15. 15. 15 항상 바쁘다. 자동화를 왜 해야 하나요? 고통의 고갯마루 끊임없이 변화하는 코드 레거시 시스템 공포심 오래된 습관들 테스트 자동화의 장애물
  16. 16. 16 자동화를 어떻게 해야 하는가? 테스트 자동화의 장애물
  17. 17. 17 테스트 사분면
  18. 18. 18 목적 : 테스트 용이성 ( 얼마나 테스트하기 쉬운가? ) - 단위 테스트, 통합테스트, 시스템테스트, 컴포넌트 테스트, 배포 테스트 - 개발자가 테스트를 작성하고 유지보수한다. - 내부 품질 - CI 에서 실행됨 테스트 종류 설명 단위 테스트 데이터페이스, 파일시스템, 외부 시스템의 연동없이 단위 기능 하나하나가 정상 동작하는지 점점한다. 개발자 관점 - 프로그램 설계 컴포넌트 테스트 시스템을 구성하는 컴포넌트들이 정상적으로 통합되어 기능이 동작하는지 점검한다. 아키텍처 관점 - 시스템 테스트 배포 테스트 애플리케이션을 배포한 후에 애플리케이션이 정확하게 설치됐는지, 제대로 설정됐는지, 필요한 서비스에 접속할 수 있는지, 제대로 응답하는지를 점검한다. 팀을 지원하는 기술측면 테스트 Q1 Q4 Q2 Q3
  19. 19. 19 장점 - 단위 테스트는 안전망 - 리팩토링을 지원 - 속도가 아니라, 품질이 목적이다. - 설계에 대한 자신감 팀을 지원하는 기술측면 테스트
  20. 20. 20 비지니스를 지원하는 기술측면 테스트 목적 - 비즈니스 관점의 테스트로 개발을 이끈다. - 올바른 질문을 한다. - 고객이 명확하게 이해하도록 돕는다. - 예제를 만들어내고, 실행가능한 테스트로 표현한다. - 외부 품질과 관련되어 있다. - 개발이 언제 끝나는지를 정의한다. 테스트 - Functional Test - Examples - Story Tests - Simulation Q1 Q4 Q2 Q3
  21. 21. 21 제품평가를 위한 비즈니스측면 테스트 목적 - 애플리케이션이 사용자가 기대하는 기능을 제공하는지 확인한다. - 애플리케이션이 명세를 만족시키는지를 검증한다. - 애플리케이션의 명세가 올바른지도 확인한다. - 제품 평가를 위한 테스트를 공개적인 행사로 진행한다. Q1 Q4 Q2 Q3 테스트 종류 설명 탐색적 테스트 테스트 수행과정에서 얻는 정보를 이용해 새롭고 더 나은 테스트를 설계한다. 창조적인 배움의 과정으로 오류를 발견하고 애플리케이션의 신규요구사항을 제공한다. 사용성 테스트 사용자가 자신의 목적을 얼마나 쉽게 달성할 수 있는지 확인하기 위해 수행한다. 애플리케이션이 사용자에게 진정 가치가 있는지를 확인한다. 사용자 인수테스트 시스템이 실제 운영 환경에서 사용될 준비가 되었는지 최종적으로 확인하는 단계이다. 시스템 검사는 사용자가 평가하고 관리자가 점검한다. 알파/베타 테스트 시스템을 릴리즈하기 직전단계의 테스트
  22. 22. 22 제품평가를 위한 기술측면 테스트 목적 : 제품이 비기능 요구사항을 충족하는지를 테스트한다. - 시스템의 용량, 가용성, 보안등 비기능 테스트를 수행한다. - 비기능 인수조건은 기능 인수 조건과 같은 방법으로 애플리케이션 요구사항의 일부다. - 프로젝트 시작전에 기본적 비기능 테스트를 구축한다. - 도구를 이용하여 자동화한다. Q1 Q4 Q2 Q3
  23. 23. 23 RobotFramework 1. RobotFramework 소개 2. RobotFramework 설치 3. RobotFramework 테스트 케이스 작성하기
  24. 24. 24 RobotFramework 란? ● 범용 테스트 자동화 프레임워크 ○ Keyword-Driven 방식의 테스팅을 사용 ○ End-to-End 인수테스트 ○ ATDD(Acceptance Test Driven Development) 도구로도 사용가능 ● Python 으로 구현됨 ○ Jython(JVM), IronPython(.Net) 에서도 실행가능 ○ Python, Java 언어로 기능을 확장할 수 있음 ● 오픈 소스 ○ GitHub 에 소스 존재 ○ Apache License ○ Nokia Siemens Network 의 테스트 프레임워크
  25. 25. 25 RobotFramework 특징 ● 테이블 형식 문법으로 테스트 케이스를 쉽게 생성할 수 있다. ● 기존 키워드들을 이용하여 상위 수준의 키워드를 재정의할 수 있다. ● 보고서와 로그를 HTML 포맷으로 제공한다. ● Platform 과 Application 에 독립적이다. ● 테스트 라이브러리를 Python 이나 Java 로 쉽게 구현할 수 있다. ● 기존 빌드 인프라구조를 위한 command line interface 를 제공한다. ● 웹 테스트를 위한 Selenium, Java GUI 테스팅, 프로세스 실행, Telnet, SSH 등을 제공한다. ● Data-Driven 테스트 케이스를 지원한다. ● 실행할 테스트 케이스를 선택하고 분류하는 태그를 제공한다. ● 테스트 케이스, 테스트 슈트 수준의 setup / teardown 을 제공한다.
  26. 26. 26 RobotFramework 구조
  27. 27. 27 RobotFramework 설치 구분 용도 Python Robot 프레임워크 구동을 위한 언어. RobotFramework 은 Python 2.7 에서 동작하기 때문에 Python 2.7.x 를 설치한다. Python 3.x 에서는 RobotFramework 이 실행되지 않는다. RobotFramework 테스트 자동화를 위한 테스트 프레임워크 도구 중 하나
  28. 28. 28 Python 2.7 설치 Python 2.7 설치 여부 확인 1. Command 창을 띄운다. 2. python --version 명령을 실행한다. 3. Python 이 설치되지 않은 경우에는 아래 화면처럼 보인다. <Python 설치되지 않은 경우>
  29. 29. 29 Python 2.7 설치 Python 설치 1. https://www.python.org/downloads/release/python-2711/ 접속한다. 2. Windows x86-64 MSI Installer 를 다운받는다. 3. 다운받은 Installer 파일(python-2.7.11.amd64) 를 실행한다. 4. 시스템 환경 변수의 Path 에 “C:Python27”, “C:Python27Scripts” 를 추가한다. a. 시스템 속성 화면을 띄운다. (제어판>시스템보안>시스템>고급 시스템 설정) b. 시스템 속성 화면 “고급" 탭에서 “환경 변수" 버튼을 클릭한다. c. 시스템 변수에서 Path 를 선택한 다음, 편집을 클릭한다. d. 새로 만들기를 클릭하고, C:Python27 를 입력한다. e. 새로 만들기를 클릭하고, C:Python27Scripts 를 입력한다. f. 확인을 누르고 빠져나온다.
  30. 30. 30 Python 2.7 설치 설치 확인 방법 1. Command 창을 새로 띄운다. 2. python --version 명령을 실행한다. 3. <Python 정상 설치시 실행 화면> 처럼 보이면 설치 완료 <Python 정상 설치시 실행 화면>
  31. 31. 31 RobotFramework 설치하기 설치 하기 1. Command 창에서 “pip install robotframework” 을 실행한다. 설치 확인 1. Command 창에서 pybot 명령을 실행한다. <RobotFramework 설치 화면> <pybot 정상 설치시 실행 화면>
  32. 32. 32 *** Test Cases *** Test Should Be Equal as Integers Should Be Equal As Integers 42 42 Should Be Equal As Integers ABCD abcd base=16 Should Be Equal As Integers 0b1011 11 실습 - 첫번째 Test Case 실습 : BuiltIn Assert 문을 이해하기 위한 테스트 케이스를 만든다. 목적 : - Builtin Assertion Keyword 들을 이해하고 사용한다. - Test Case 파일의 Test Cases 테이블의 구조를 이해한다. - Test Case 파일을 실행하는 방법을 이해한다. - Test 실행 결과를 파악할 수 있다. 파일 이름 : Assert.robot 테스트케이스 실행방법 : pybot Assert.robot 실행결과 확인 - 콘솔 - 테스트 실행 보고서 : ./report.html - 테스트 로그 : ./log.html <Assert.robot 파일 내용>
  33. 33. 33 Keywords Libraries Strategy Description Builtin http://robotframework.org/robotframework/latest/libraries/BuiltIn.html Collections http://robotframework.org/robotframework/latest/libraries/Collections.html DateTime http://robotframework.org/robotframework/latest/libraries/DateTime.html Dialogs http://robotframework.org/robotframework/latest/libraries/Dialogs.html OperatingSystem http://robotframework.org/robotframework/latest/libraries/OperatingSystem.html Process http://robotframework.org/robotframework/latest/libraries/Process.html ScreenShot http://robotframework.org/robotframework/latest/libraries/Screenshot.html String http://robotframework.org/robotframework/latest/libraries/String.html Telnet http://robotframework.org/robotframework/latest/libraries/Telnet.html XML http://robotframework.org/robotframework/latest/libraries/XML.html Selenium2Library http://robotframework.org/Selenium2Library/doc/Selenium2Library.html DatabaseLibrary http://franz-see.github.io/Robotframework-Database-Library/api/0.5/DatabaseLibrary.html RobotFramework 에서 사용할 수 있는 Keyword Library 들의 도움말
  34. 34. 34 Keyword Arguments 설명 Should Be Empty item, msg=None item 이 empty 인지 검사한다. ↔ Should Not Be Empty Should Be Equal first,second,msg=None, values=True first 와 second 가 동일한지 비교한다. ↔ Should Not Be Equal values 가 False 이면 msg 만 출력한다. ( msg 가 없을 때는 값을 출력함. ) Should Be Equal As Integers first,seocnd,msg=None, values=True,base=None first와 second 를 정수로 변환한 값이 같은지 검사한다. ↔ Should Not Be Equal As Integers Should Be Equal As Numbers first,seocnd,msg=None, values=True,precision=6 first 와 second 를 숫자로 바꾼 다음에 일치하는지 검사한다. prcision 에 지정한 소수점 자리까지 값이 일치하는지 비교한다. ↔ Should Not Be Equal As Numbers Should Be Equal As Strings first,seocnd,msg=None, values=True first 와 seoncd 를 문자로 변환한 값이 일치하는지 검사한다. ↔ Should Not Be Equal As Strings Should Be True condition,msg=None condition 이 참인지 검사한다. ↔ Should Not Be True Should Contain container,item,msg=None, values=True container 가 item 을 포함하고 있는지 검사한다. ↔ Should Not Contain Should Contain X Times container,item,count, msg=None,values=True container 가 item 을 정확하게 count 번 포함하고 있는지 검사한다. ↔ Should Not Contain X Times Should End With str1,str2,msg=None, values=True str1 이 str2 로 끝나는지 검사한다. Builtin Assertions RobotFramework 이 Builtin 으로 제공하는 Assertion 문들
  35. 35. 35 Keyword Arguments 설명 Should Match string,pattern, msg=None, values=True string 이 pattern 과 일치하는지 검사한다. ↔ Should Not Match pattern 에 *,? 를 사용할 수 있다. (? 임의의 문자 한개 일치, * 임의의 문자 N 개 일치 ) Should Match Regexp string,pattern, msg=None, values=True string 이 pattern 과 일치하는지 검사한다. ↔ Should Not Match Regexp Should Start With str1,str2,msg=None, values=True str1 이 str2 로 시작하는지 검사한다. ↔ Should Not Start With Variable Should Exist name,msg=None name 이라는 변수가 있는지 검사한다. Variable Should Not Exist name,msg=NOne name 이라는 변수가 없는지 검사한다. Builtin Assertions
  36. 36. 36 Keyword 설명 Should Not Be Empty Should Be Empty 의 반대 Should Not Be Equal Should Be Equal 의 반대 Should Not Be Equal As Integers Should Be Equal As Integers 의 반대 Should Not Be Equal As Numbers Should Be Equal As Numbers 의 반대 Should Not Be Equal As Strings Should Be Equal As Strings 의 반대 Shoult Not Be True Shoult Be True 의 반대 Should Not Contain Should Contain 의 반대 Should Not End With Should End With 의 반대 Should Not Match Should Match 의 반대 Should Not Match Regexp Should Match Regexp 의 반대 Should Not Start With Should Start With 의 반대 Variable Should Not Exist Vairable Should Exist 의 반대 Builtin Assertions
  37. 37. 37 반환 코드 설명 0 critical 한 테스트 케이스들이 모두 통과되었다. 1-249 실패한 critical 테스트 수 250 실패한 critical 테스트 수가 250개 이상 251 도움말 혹은 버전 정보가 출력됨 테스트 성공/실패 Return Code : RobotFramework 실행 프로세스가 실행종료시 반환하는 실행 코드 - CI 등과 연동할 때 반환 코드를 이용한다. - --NoStatusRC 옵셩을 주면 critical 한 테스트가 실패하더라도 무조건 0 을 반환한다. 구분 설명 Windows cmd> pybot --version cmd> echo %ERRORLEVEL% 변수 Unix % pybot --version % echo $? 251 반환 코드 확인 방법
  38. 38. 38 테스트 성공/실패 구분 용도 전체 실패 critical 하지 않은 테스트 케이스가 하나라도 실패하면 실패다. Test Case 실패 Test Case 의 Assertion 문이 실패한다. Test Case 실행에 지정된 시간(Timeout)이상이 소요된다. 키워드가 실패한다. 키워드 실패 Keyword 의 Assertion 문이 실패한다. Keyword 실행에 지정된 시간(Timeout)이상이 소요된다. 반환코드는 테스트 실행이 성공/실패했는지를 알려준다.
  39. 39. 39 *** Test Cases *** Test Should Fail Fail Test Failed 실습-Assertion 실패 실습 : 실패하는 테스트 케이스 작성하기 목적 : - 테스트 실행 실패시 반환코드의 값을 이해하고 활용할 수 있다. 확인 - 테스트 실행(프로세스)의 반환 코드를 확인한다. <Assert.robot 파일 내용>
  40. 40. 40 *** Test Cases *** Test Should Fail by Timeout [Timeout] 1 Sleep 2 실습-Test Timeout 실습 : 지정된 시간을 초과하는 테스트 케이스 작성하기 목적 : - Test Timeout 을 이해하고 활용할 수 있다. 확인 - 테스트 실행(프로세스)의 반환 코드를 확인한다.
  41. 41. 41 20090322 19:58:42.528 ERROR Error in file '/home/robot/tests. robot' in table 'Setting' in element on row 2: Resource file 'resource. robot' does not exist 20090322 19:58:43.931 WARN Keyword 'SomeLibrary.Example Keyword' is deprecated. Use keyword `Other Keyword` instead. <RobotFramework 실행 오류 로그> 오류와 경고 : 테스트를 실행하는 동안에 발생한 오류들은 ERROR 와 WARNING 으로 구분된다. 오류와 경고는 콘솔에도 출력되고, log 파일의 “Test Execution Errors” 섹션에도 기록된다. 오류와 경고
  42. 42. 42 *** Test Cases *** Test Should Fail by Timeout [Timeout] 1 Sleep 2 실습-에러 유발하기 실습 : 테스트 케이스 파일에 오류를 발생시킨다. 목적 : - 오류를 발생시키고, 오류가 보고되는 방식을 이해할 수 있다. 확인 - 콘솔 화면 - log.html
  43. 43. 43 Critial Test 가 모두 성공한 경우는 배경이 초록색 Report 파일 생성 - 기본 이름 : report. html 테스트 보고서
  44. 44. 44 테스트 보고서 Critial Test 가 하나라도 실패한 경우는 배경이 빨간색
  45. 45. 45 *** Test Cases *** Test Should Fail by Timeout [Timeout] 1 Sleep 2 실습-Tag 이용하기 실습 : Test Case 에 tag 를 지정하고, 테스트 실행시 tag 를 사용한다. - 실패하는 Test Case 에는 indev 태그를 단다. - 성공하는 Test Case 에는 finished 태그를 단다. 목적 : - Test Case 에 tag 를 지정하는 방식을 이해하고 활용할 수 있다. - Tag 를 이용하여 테스트를 실행할 수 있다. 실행 - pybot --noncritical indev . 확인 - 콘솔 화면 : 테스트 - 실행 프로세스의 반환 코드를 확인한다. - report.html : 보고서 결과가 성공인지 확인한다.
  46. 46. 46 변수 설명 [Documentation] 테스트 케이스에 대한 설명을 문서화한다. [Tags] 테스트 케이스에 대한 tag 를 지정한다. [Setup] 테스트 케이스가 시작되기 전에 실행할 키워드를 지정한다. [Teardown] 테스트 케이스가 종료된 후에 실행할 키워드를 지정한다. [Timeout] 테스트 케이스의 타임아웃을 지정한다. 테스트 실행시간이 지정된 시간을 초과한 경우, 테스트가 강제로 종료되고 테스트 케이스는 실패한다. [Template] 사용할 Template 키워드를 정의한다. 테스트 자체에는 Argument 로 사용할 데이터만 포함한다. Test Cases Table 테스트 케이스 테이블에서 설정할 수 있는 항목들은 다음과 같다. - Setup / Teardown 이 설정되면, Settings Table 에서 정의한 Setup/Teardown 은 무시된다.
  47. 47. 47 *** Test Cases *** Test Should Be Equal as Integers [Setup] Log To Console Start Of ${TEST NAME} [Teardown] Log To Console End Of ${TEST NAME} Should Be Equal As Integers 42 42 Should Be Equal As Integers ABCD abcd base=16 Should Be Equal As Integers 0b1011 11 실습-Test Setup/Teardown 실습 : Test Case 에 Setup/Teardown 시 화면에 로그를 출력한다. - Test Case 의 [Setup] 에서 화면에 로그를 출력한다. - Test Case 의 [Teardown] 에서 화면에 로그를 출력한다. 목적 : - Test Case 의 실행 구조를 파악하고 활용할 수 있다. 확인 - 테스트를 실행해서 테스트 케이스가 성공하는지 확인한다. <Test Case 의 Setup/Teardown>
  48. 48. 48 *** Variables *** ${ABCD} ABCD *** Test Cases *** Test Should Be Equal as Integers Should Be Equal As Integers 42 42 Should Be Equal As Integers ${ABCD} abcd base=16 Should Be Equal As Integers 0b1011 11 실습-변수 사용하기 실습 : 상수 ABCD 를 변수로 선언한다. 목적 : - 변수로 선언하고 활용할 수 있다. 확인 - 테스트를 실행해서 테스트 케이스가 성공하는지 확인한다. <변수 사용 예제>
  49. 49. 49 실습 : 상수 0b1011 를 변수로 선언하고, 테스트에 사용한다. 목적 : - RobotFramework 에서 0b1011 은 binary 로 표현된 숫자 형식이다. - 이런 형식을 처음보는 사람은 의미를 파악하기 쉽지 않다. - 0b1011의 의미를 쉽게 파악할 수 있게 의미 있는 변수 이름을 짓는다. 확인 - 테스트를 실행해서 테스트 케이스가 성공하는지 확인한다. 실습-변수 사용하기
  50. 50. 50 Variables 구분 설명 Scalar Variable *** Variables *** ${NAME} Robot Framework ${VERSION} 2.0 ${ROBOT} ${NAME} ${VERSION} ${ERROR} VALUE1 VAUE2 #Error List Variable *** Variables *** ${TEAM1_MANAGER} Michael @{TEAM1_MEMBER} Tom Peter @{TEAM1} ${TEAM1_MANAGER} @{TEAM1_MEMBER} Dictionay Variable *** Variables *** &{USER} username=robot password=pass Environment Variable *** Test Cases *** Env Variables Log Current user: %{USER} Run %{JAVA_HOME}${/}javac RobotFramework 에서는 다양한 형식의 변수들을 사용할 수 있다.
  51. 51. 51 List Variables List Variable : 프로그램 언어의 배열 - 정의 : @{USER} robot password - 키워드의 Argument 로 List 변수를 넘길 수 있음 - Login robot password - Login @{USER} - 요소를 접근하는 방법 - @{USER}[index] - 양의 index 는 0~n-1 ( 0: 맨처음, n-1: 맨끝 ) - 음의 index -n~-1 ( -1: 맨끝, -n:맨처음 ) - Log To Console @{USER}[0], @{USER}[1] - Log To Console @{USER}[-2], @{USER}[-1] - 요소가 하나밖에 없는 List Variable 은 Scalar Variable 로 접근할 수 있음 - @{MANAGER} Me - Log To Console ${MANAGER}
  52. 52. 52 Dictionay Variable Dictionary Variable : (key,value) 쌍을 가지는 자료구조 - 정의 : - *** Variables *** - &{USER} username=robot password=pass - 키워드의 Argument 로 Dictionary 변수를 넘길 수 있음 - *** Test Cases *** - Login username=robot password=pass - Login &{USER} - 요소를 접근하는 방법 : - &{USER}[name] - Log To Console &{USER}[username], &{USER}[password] - ${USER.name} - Log To Console ${USER.username}, ${USER.password} - Dictionary 추가된 순서로 접근하는 방법 : &{User}[${1}] - 요소의 키를 배열로 가져오기 : @{USER} - Log To Console @{USER}
  53. 53. 53 실습 : 광역자치단체가 인구순으로 정렬 되었는지 확인한다. - 지방자치단체 목록을 담은 변수를 선언한다. - 첫번째 원소가 ‘경기’인지 확인한다. - 마지막 원소가 ‘제주'인지 확인한다. 목적 : - 목록형 변수를 이해하고 활용할 수 있다. 확인 - 테스트를 실행해서 테스트 케이스가 성공하는지 확인한다. 실습 - 변수 사용하기 경기 서울 부산 인천 대구 대전 광주 울산 12522 10022 3513 2925 2487 1518 1472 1173 경남 경북 충남 전남 전북 충북 강원 제주 3364 2702 2077 1908 1869 1583 1549 624 <2016 광역자치단체별 인구수(단위:천명)>
  54. 54. 54 ** Variables *** @{PROV_ORDERED_BY_POPULATION} 서울 경기 부산 제주 *** Test Cases *** Test Province Ordered By Population Should Be Equal @{PROV_ORDERED_BY_POPULATION}[0] 서울 Should Be Equal @{PROV_ORDERED_BY_POPULATION}[-1] 제주 실습 - 변수 사용하기
  55. 55. 55 실습 : 각 광역자치단체별 인구수 Dictionary 로 선언하고 - 지방자치단체별 인구수를 Dictionary 로 선언한다. - 자치단체별 인구수가 올바로 할당되었는지 검사한다. 목적 : - dictionary 변수를 이해하고 활용할 수 있다. 확인 - 테스트를 실행해서 테스트 케이스가 성공하는지 확인한다. 실습 - 변수 사용하기
  56. 56. 56 *** Variables *** &{PROV_ORDERED_BY_POPULATION} 경기=12522 서울=10022 부산=3513 제주=624 &{DICT} username=Tom password=secret *** Test Cases *** Test Province Should Be Equal &{PROV_ORDERED_BY_POPULATION}[경기] 12522 Should Be Equal ${DICT.username} Tom 실습 - 변수 사용하기
  57. 57. 57 Assigning Variables 구분 설명과 예제 Scalar Vairable keyword 가 반환하는 값들을 scalar variable 로 할당할 수 있다. *** Test Cases *** Assign To List Variable ${scalar}= Get Text username List Variable keyword 가 List Variable 이나 list 와 유사한 객체를 반환하는 경우 list variable 로 할당할 수 있다. *** Test Cases *** Assign To List Variable @{team}= Create Team Tom Mary Steven Length Should Be @{team} 4 Dictionary Variable keyword 가 Dictionary Variable 을 반환하는 경우 dictionary variable 로 할당할 수 있다. *** Test Cases *** Assign To Dictionary Variable &{dict} = Create Dictionary first=1 second=${2} ${3}=third Length Should Be ${dict} 3 Do Something &{dict} Log ${dict.first} Multiple Variables keyword 가 list 나 list-like 를 반환하는 경우 여러 변수에 할당할 수 있다. *** Test Cases *** Assign Multiple ${a} ${b} ${c} = Get Three ${first} @{rest} = Get Three @{before} ${last} = Get Three ${begin} @{middle} ${end} = Get Three
  58. 58. 58 Built-in Variables 구분 변수명 설명 Operating System ${CURDIR} 테스트 데이터 파일이 있는 절대 경로. 변수는 대소문자를 구별함. ${TEMPDIR} 시스템 임시 디렉토리에 대한 경로. UNIX 의 경우 /tmp, Windows 의 경우 c:Documents and Settings<user>Local SettingsTemp. ${EXECDIR} 테스트 실행을 시작한 디렉토리의 절대 경로 ${/} 시스템 디렉토리 경로 구분자. UNIX: /, 윈도우즈 : ${:} 시스템 PATH 환경 변수의 구분자. UNIX : ‘:’, 윈도우즈: ‘;’ ${n} 시스템의 라인 구분자. UNIX: n, Windows : rn Number ${숫자} 예) ${10}, ${3.14} Boolean ${true} / ${false} ${None} / ${null} Boolean 값 Python 의 None 값. Java 의 null 값 Space ${SPACE} 공백문자 Should Be Equal ${SPACE} Should Be Equal ${SPACE * 4} Should Be Equal ${SPACE * 10} Should Be Equal "${SPACE}" " " Should Be Equal "${SPACE * 2}" " " Empty ${EMPTY} 빈 값. Should Be Equal ${EMPTY}
  59. 59. 59 Automatic Variables 변수 설명 사용 가능 ${TEST NAME} 현재 테스트 케이스 이름 Test case @{TEST TAGS} 현재 테스트 케이스의 태그 목록. 알파벳 순으로. Set Tags, Remove Tags 사용 가능 Test case ${TEST DOCUMENTATION} 현재 테스트 케이스의 Documentation Test case ${TEST STATUS} 현재 테스트 케이스의 상태. PASS 혹은 FAIL Test teardown ${TEST MESSAGE} 현재 테스트 케이스의 메시지 ${PREV TEST NAME} 이전 테스트 케이스 이름. 테스트 케이스가 실행되기 전에는 Empty String. Everywhere ${PREV TEST STATUS} 이전 테스트 케이스의 상태. PASS/FAIL. 테스트게이스 실행전 : EMPTY String Everywhere ${PREV TEST MESSAGE} 이전 테스트 케이스의 에러 메지시 Everywhere ${SUITE NAME} 현재 테스트 Suite 의 이름 Everywhere ${SUITE SOURCE} 슈트 파일 혹은 디렉토리의 절대 경로 Everywhere ${SUITE DOCUMENTATION} 현재 테스트 슈트의 Documentation Everywhere &{SUITE METADATA} 현재 테스트 슈트의 metadata Everywhere
  60. 60. 60 Automatic Variables 변수 설명 사용 가능 ${SUITE STATUS} 현재 테스트 슈트의 상태. PASS/FAIL Suite teardown ${SUITE MESSAGE} 현재 테스트 슈트의 전체 메시지. 통계를 포함한다. ${KEYWORD STATUS} 현재 키워드의 상태. PASS/FAIL User keyword teardown ${KEYWORD MESSAGE} 현재 키워드의 에러 메시지 ${OUTPUT FILE} 출력 파일의 절대 경로 Everywhere ${LOG FILE} 로그 파일의 절대 경로 ( Log file 이 없으면 NONE ) Everywhere ${REPORT FILE} 보고서 파일의 절대 경로 ( Report file 이 없으면 NONE ) Everywhere ${DEBUG FILE} Debug 파일의 절대 경로 ( 없으면 NONE ) Everywhere ${OUTPUT DIR} 출력 디렉토리의 절대경로 Everywhere
  61. 61. 61 Variable Priorities 변수 설명 우선순위 Variable Set During Test Execution 키워드 반환 값을 이용해서 정의한 변수나 Set Test/Suite/Global Variable 을 이용해서 정의한 변수는 항상 다른 변수를 덮어쓸 수 있다. 단, 이 변수들은 정의된 스코프동안만 유효하고, 정의된 스코프 외부에서는 유효하지 않다. 1 Built-in Variables 모든 변수중에서 우선순위가 가장 높다. Variable Table, Command Line 을 이용해서 값을 변경할 수 없다. 테스트 실행 도중에는 바꿀 수 있다. 2 Variables from Command Line Test Case 파일의 Variable Table 에서 정의된 변수나 Resource, Variable File 에서 Import 한 변수들을 덮어쓴다. Command Line 에서 지정한 vaiable_files 의 변수보다 개별 설정(--variable) 변수가 우선순위가 높다. 3 Variable Table in a Test Case File Setting 에서 불러오는 Resource File 이나 Variable File 에 선언된 Variable 을 덮어쓴다. 4 Imported Resource or Variable File 보고서 파일의 절대 경로 ( Report file 이 없으면 NONE ) 5
  62. 62. 62 Variable Scope 변수 설명 Global Scope (대문자만 사용) 어디에서든 변수에 접근할 수 있다. 정의 방법 - Command Line 에서 정의한다. ( --variable, --variablefile ) - Set Global Variable 을 이용해서 정의한다. Test Suite Scope (대문자만 사용) Test Suite Scope 를 가진 변수들은 Test Suite 내 어디에서든 접근할 수 있다. Test Suite Scope 는 재귀적이지 않다. 하위 레벨의 Suite 에서 상위 레벨 Suite 의 변수들을 접근할 수 없다. 정의방법 : - Variable Tables 에서 정의한다. - Resource 나 Variable File 에서 가져온다. - Set Suite Variable 이용해서 정의한다. Test Case Scope (대문자만 사용) Test Case 스코프의 변수들은 변수가 정의된 테스트 케이스와 테스트가 사용하는 사용자 Keyword 모두에서 볼 수 있다. 테스트 케이스에서는 글로벌 변수처럼 보이기 때문에 대문자를 사용하는 것을 추천한다. 정의 방법 : Set Test Variable 키워드를 이용하여 정의한다. Local Scope (소문자만 사용) Local Scope 변수들은 변수가 정의된 Test Case 와 Keyword 에서만 보인다. 다른 Test Case 와 Keyword 에서는 보이지 않는다. 정의방법: Local Variable 은 Keyword 의 반환값을 이용해서 정의된다.
  63. 63. 63 실습-실패하는 테스트 실습 : Shoule Be Equal 을 이용해서 실패하는 테스트를 작성한다. - Should Be Equal 은 패러미터를 4개까지 사용할 수 있다. - 첫번째(first), 두번째(second) 패러미터는 필수 패러미터다. - 세번째(msg), 네번째(values) 패러미터는 선택 팩러미터다. 목적 : - 실패하는 테스트를 작성하고, 실패시 오류 메시지를 이해한다. - 필수 패러미터와 선택 패러미터를 이해하고 사용할 수 있다. - 선택 패러미터 사용시 패러미터 이름을 지정하고 사용할 수 있다. - 테스트 실패시 화면 출력과 보고서의 내용을 이해할 수 있다. 파일 이름 :Failing_Test.robot 테스트케이스 실행방법 : pybot Failing_Test.robot 확인 - 테스트를 실행해서 테스트 케이스가 실패하는지 확인한다. - 콘솔 출력과 출력된 보고서를 확인한다.
  64. 64. 64 *** Test Cases *** Test Print Message of Should Be Equal (msg=,values=False) Should Be Equal ${emptyname} ${emptystring} False Test Print Message of Should Be Equal (msg=Message,values=False) Should Be Equal ${emptyname} ${emptystring} Message False Test Print Message of Should Be Equal (msg=,values=True) Should Be Equal ${emptyname} ${emptystring} values=True Test Print Message of Should Be Equal (msg=Message,values=True) Should Be Equal ${emptyname} ${emptystring} values=True msg=Message 실습-실패하는 테스트
  65. 65. 65 실습-계산기 만들기 실습 : Add 키워드를 정의하고, Add 가 정확하게 결과를 계산하는지 확인하기 위한 테스트를 작성한다. - Add 의 첫번째 패러미터는 augend 이다. - Add 의 두번째 패러미터는 addend 이다. - Add 는 augend 와 addend 의 값을 더한 결과를 반환한다. 목적 : - 사용자 정의 키워드를 선언하는 방법을 이해하고 사용할 수 있다. - 사용자 정의 키워드에서 Argument 를 사용하는 방법을 이해하고 활용할 수 있다. - 사용자 정의 키워드에서 값을 반환하는 방법을 이해하고 활용할 수 있다. - 키워드의 결과값을 변수로 저장하고 활용할 수 있다. 파일 이름 : Calculator.robot 테스트케이스 실행방법 : pybot Calculator.robot
  66. 66. 66 실습-계산기 만들기 *** Test Cases *** Calculator Add Test ${sum}= Calculator Add 1 2 Should Be Equal As Integers ${sum} 3 *** Keywords *** Calculator Add [Arguments] ${operand1} ${operand2} ${result}= Evaluate ${operand1} + ${operand2} [Return] ${result}
  67. 67. 67 Keywords Table 변수 설명 [Documentation] 테스트 케이스에 대한 설명을 문서화한다. [Tags] 키워드의 태그를 지정한다. [Arguments] 키워드의 argument 를 정의한다. [Return] 키워드의 반환 값을 지정한다. [Teardown] 키워드가 종료된 후에 실행할 Teardown 을 지정한다. [Timeout] 키워드의 타임아웃을 지정한다. Keyword 는 프로그램의 함수/메소드와 같다. - Argument 를 가질 수 있다. - 반환 값을 가질 수 있다. - 키워드에서 설정할 수 있는 속성은 다음과 같다.
  68. 68. 68 Keyword Argument Positional Arguments(위치로 식별하는 Arguments) - 키워드에 [Arguments] 를 이용하여 정의한다. - 키워드를 사용할 때 Argument 결정 방법 - 위치로 결정하기 : Keyword 를 부를 때 사용된 위치에 따라 결정 - Print Employee Tom 10 - 이름지정하기 : Keyword 를 부를 때 Argument 의 이름을 지정한다. - Print Employee age=10 name=Tom - Argument 의 기본값(default value) - 지정 방식 : [Arguments] ${name} ${age}=10 - 기본값을 지정한 Argument 는 선택적인(optional) argument 가 된다. - 기본값이 없는 Argument 는 필수(required) argument 다. - 선택적인 argument 를 필수 argument 앞에 정의하면, 키워드를 부를 때 오류가 발생한다. - 오류 메시지 : Invalid argument specification: Non-default argument after default arguments. - 가변길이 Argument 지정 방식 - 가변길이 Argument : [Arguments] @{students} - 필수 Argument + 가변길이 Argument : [Arguments] ${student} @{friends} - 필수 Argument + 선택 Argument + 가변길이 Argument : [Arguments] ${student} ${age}=10 @{friends} - Dictionary Argument 지정 ( kwargs ) - Dictionary Argument 만 : [Arguments] &{properties} - 필수 + Dictionary Argument : [Arguments] ${teacher} &{properties} - 가변길이 Argument + Dictionary Argument : [Arguments] @{varargs} &{properties} *** Keywords *** Print Employee [Arguments] ${name} ${age} Log To Console (${name},${age}) <[Arguments] 를 이용해서 정의하기>
  69. 69. 69 Return Value *** Test Cases *** One Return Value ${ret} = Return One Value argument Some Keyword ${ret} Multiple Values ${a} ${b} ${c} = Return Three Values @{list} = Return Three Values ${scalar} @{rest} = Return Three Values *** Keywords *** Return One Value [Arguments] ${arg} Do Something ${arg} ${value} = Get Some Value [Return] ${value} Return Three Values [Return] foo bar zap Keyword 의 Return Value 를 지정하는 방법 - [Return] 으로 반환 - Return From Keyword / Return From Keyword If 를 사용 *** Test Cases *** One Return Value ${ret} = Return One Value argument Some Keyword ${ret} Advanced @{list} = Create List foo baz ${index} = Find Index baz @{list} Should Be Equal ${index} ${1} ${index} = Find Index non existing @{list} Should Be Equal ${index} ${-1} *** Keywords *** Return One Value [Arguments] ${arg} Do Something ${arg} ${value} = Get Some Value Return From Keyword ${value} Fail This is not executed Find Index [Arguments] ${element} @{items} ${index} = Set Variable ${0} :FOR ${item} IN @{items} Return From Keyword If '${item}' == '${element}' ${index} ${index} = Set Variable ${index + 1} Return From Keyword ${-1} # Could also use [Return]
  70. 70. 70 실습-계산기 만들기 실습 : 빼기, 곱하기, 나누기 연산을 추가하고, 계산 결과가 정확한지 확인하는 테스트 케이스를 작성한다. 파일 이름 : Calculator.robot 테스트케이스 실행방법 : pybot Calculator.robot
  71. 71. 71 Test Case File Sample *** Settings *** Documentation Sample Test Case File Library Selenium2Library Resource ${RESOURCES}/common.robot *** Variables *** ${HOST} localhost:7272 ${LOGIN URL} http://${HOST}/ ${WELCOME URL} http://${HOST}/welcome.html ${BROWSER} Firefox *** Test Cases *** Valid Login Open Login Page Input Name tom Input Password secret Shuold Be Equal ... *** Keywords *** Open Login Page [Documentation] Opens browser to login page Open Browser ${LOGIN URL} ${BROWSER} Title Should Be Login Page Input Name [Arguments] ${name} Input Text username_field ${name} Input Password [Arguments] ${password} Input Text password_field ${password} Settings Table Variables Table Test Case Table 사용자 정의 Keyword
  72. 72. 72 Settings Table Settings Table 에서는 테스트 케이스 파일안에서 글로벌하게 적용되는 다양한 설정을 할 수 있다. - Settings Table 에서 설정 가능한 목록은 아래 표와 같다. 키워드 설명 Documentation Test Suite 에 대한 문서를 기록한다. Metadata name value 형식으로 메타데이터를 정의한다. Force Tags Test Suite 에 있는 모든 Test Case 들에 tag 를 지정한다. Suite Setup Test Suite 에 있는 Test Case 들이 실행되기 전에 실행할 키워드를 지정한다. Suite Teardown Test Suite 에 있는 모든 Test Case 들이 실행된 후에 실행할 키워드를 지정한다. Test Setup Test Suite 에 있는 각 Test Case 들이 실행되기 전에 실행된다. Test Teardown Test Suite 에 있는 각 Test Case 가 실행된 후에 실행된다. Test Timeout 테스트 케이스가 지정된 시간을 초과하면, 테스트 케이스를 중지한다. Library 테스트에 사용할 Library 를 지정한다. 절대경로, 상대 경로, PYTHONPATH Resource 읽어들일 리소스 파일의 경로를 지정한다. Variables 변수가 정의된 파일 경로를 지정한다.
  73. 73. 73 Settings Table 실습 : Settings 테이블에서 Suite Setup/Teardown, Test Setup/Teardown 을 설정하고 테스트를 실행해 본다. 목록 - Suite Setup/Teardown 의 동작 구조를 이해하고 활용할 수 있다. - Test Setup/Teardown 의 동작 구조를 이해하고 활용할 수 있다. - Timeout 을 이해하고 활용할 수 있다.
  74. 74. 74 Settings Table *** Settings *** Suite Setup Setup Suite Setting Suite Teardown Teardown Suite Setting Test Setup Setup Test Test Teardown Teardown Test *** Test Cases Test Something 1 Log To Console LOG:Test Something 1 Test Something 2 Log To Console LOG:Test Something 2 *** Keywords *** Setup Suite Setting Log To Console LOG:Setup Suite Setting Teardown Suite Setting Log To Console LOG:Teardown Suite Setting Setup Test Log To Console LOG:Setup Test Teardown Test Log To Console LOG:Teardown Test
  75. 75. 75 Settings Table 예제 *** Settings *** Documentation A Test Case for testing … Some more documentation Metadata vesion 1.0 Force Tags indev Suite Setup Connect to Database Suite Teardown Disconnect Database Test Setup Login Test Teardown Logout Test Timeout 5 Library Selenium2Library Resource resource.txt Variables myvariable.py
  76. 76. 76 For-Loop 반복하고 싶을 때 :FOR 루프를 사용할 수 있다. - 목록을 패러미터로 전달한다. - FOR 루프 안에서 사용하는 키워드들은 들여쓰기를 해야 한다. - 들여쓰기를 사용할 때는 역슬래쉬()문자를 사용한다. - 들여쓰기가 끝나는 지점이 FOR 루프가 끝나는 지점이다. - 중첩 FOR 루프 (Netsted For Loop)은 지원하지 않는다. ( 중첩된 For Loop 을 수행할 별도 키워드를 만든다. ) 예제 설명 *** Test Cases *** Example 1 :FOR ${animal} IN cat dog Log ${animal} Log 2nd keyword Log Outside loop 목록을 직접 지정한다. 루프를 두번 실행한다. :FOR 루프 안의 문장을 들여쓴다. *** Test Cases *** Example 2 :FOR ${var} IN one two ... ${3} four ${last} Log ${var} 목록을 두 줄에 걸쳐 선언한다. *** Test Cases *** Example 3 :FOR ${element} IN @{ELEMENTS} Start Element ${element} 변수를 사용하여 목록을 지정한다.
  77. 77. 77 For-Loop For-Loop 에서 여러 변수를 사용할 수 있다. 예제 설명 *** Test Cases *** Three loop variables :FOR ${index} ${english} ${finnish} IN ... 1 cat kissa ... 2 dog koira ... 3 horse hevonen Add to dictionary ${english} ${finnish} ${index} :FOR ${name} ${id} IN @{EMPLOYERS} Create ${name} ${id} 목록을 직접 지정한다. 루프를 두번 실행한다. :FOR 루프 안의 문장을 들여쓴다.
  78. 78. 78 For-Loop 숫자를 이용해서 반복문을 제어하고 싶을 때에는 :FOR IN RANGE 를 사용한다. 범위 지정 방법 설명 및 예제 범위의 최대값을 지정 최대값만 지정하는 경우의 범위 : 0~최대값-1 :FOR ${index} IN RANGE 10 # 0~9 범위의 최소값과 최대값을 지정 최대소값과 최대값을 지정한 경우의 범위 : 최소값~최대값-1 :FOR ${index} IN RANGE 1 11 #1~10 범위의 최소값, 최대값, 증분을 지정 최소값, 최대값, 증분을 지정한 경우의 범위 : 최소값~최대값-1 실제 루프에서 실행되는 값은 : 최소값 + n*증분 :FOR ${index} IN RANGE 5 26 10 # 5,15,25 증분이 음수인 경우 :FOR ${index} IN RANGE 13 -13 -10 #13,3,-7 범위값에 연산식을 지정한 경우 범위에 연산식을 지정할 수도 있다. :FOR ${index} IN RANGE ${var}+1
  79. 79. 79 For-Loop :FOR INDEX IN ENUMERATE - 루프에서 INDEX 를 사용해야 할 때 사용한다. *** Test Case *** For-in-enumerate with two values per iteration :FOR ${index} ${english} ${finnish} IN ENUMERATE ... cat kissa ... dog koira ... horse hevonen Add to dictionary ${english} ${finnish} ${index}
  80. 80. 80 For-Loop :FOR IN ZIP - 연관된 목록을 FOR 루프에서 동시에 처리해야 할 때 사용한다. *** Variables *** @{NUMBERS} ${1} ${2} ${5} @{NAMES} one two five *** Test Cases *** Iterate over two lists manually ${length}= Get Length ${NUMBERS} : FOR ${idx} IN RANGE ${length} Number Should Be Named ${NUMBERS}[${idx}] ${NAMES}[${idx}] For-in-zip : FOR ${number} ${name} IN ZIP ${NUMBERS} ${NAMES} Number Should Be Named ${number} ${name}
  81. 81. 81 For-Loop For Loop 제어할 필요가 있을 때, Exit For Loop/Continue For Loop 를 사용한다. 제어 설명 및 예제 Exit For Loop Exit For Loop If 프로그램 언어의 break 문과 동일하다. *** Test Cases *** Exit Example ${text} = Set Variable ${EMPTY} :FOR ${var} IN one two Run Keyword If '${var}' == 'two' Exit For Loop ${text} = Set Variable ${text}${var} Should Be Equal ${text} one Continue For Loop Continue For Loop If 프로그램 언어의 continue 문과 동일하다. *** Test Cases *** Continue Example ${text} = Set Variable ${EMPTY} :FOR ${var} IN one two three Continue For Loop If '${var}' == 'two' ${text} = Set Variable ${text}${var} Should Be Equal ${text} onethree
  82. 82. 82 For-Loop 실습 : 광역자치단체별 인구를 인구가 많은 곳부터 가장 적은 곳까지 순서대로 출력한다. 목록 - :FOR 루프를 이해하고 활용할 수 있다. - dictionary 변수를 선언하고 활용할 수 있다.
  83. 83. 83 Test Suite Name Test Suite 이름은 디렉토리 이름과 Test Suite 이름으로 구성된다. - 파일의 Test Suite 이름 - 확장자는 제외한다. - 밑줄(_, underscore)이 공백으로 대체된다. - 디렉토리의 테스트 슈트 이름 - 밑줄이 공백으로 대체된다. - 실행 순서 지정 - 파일이나 디렉토리에 ‘숫자__’ (밑줄 두개) 형식으로 기술한다. - Suit Name 지정하기 - robot -s “Some Tests” . 구분 예제 Test Suite 이름 파일 some_tests.robot Some Tests 01__some_tests.robot Some Tests 디렉토리 My_test_directory My test directory 02__My_test_directory My test directory 경로 My_test_directory/some_tests.robot My test directory.Some Tests 02__My_test_directory/01__some_tests.robot My test directory.Some Tests
  84. 84. 84 테스트 케이스 실행 순서 실행 순서 - 같은 테스트 케이스 파일에 있는 테스트들은 파일에 정의된 순서대로 실행된다. - 상위 레벨에 있는 테스트 Suite 들은 Alphabet 순서대로 실행된다. - Command Line 에서 여러 디렉토리나 파일을 여러 개 지정한 경우 지정된 순서대로 실행된다. 순서 지정하기 - 같은 디렉토리내에 있는 테스트 슈트들의 순서를 정하고 싶으면 ‘nn__’ 형식의 접두어(prefix)를 사용한다. - ex) 01__first.robot, 02_second.robot
  85. 85. 85 Test Case Styles Test Case 를 아래 세 가지 중 하나의 스타일로 정의할 수 있다. - Keyword-Driven Style - Data-Driven Style - Behavior-Driven Style
  86. 86. 86 Test Case Styles *** Test Cases *** Valid Login Open Login Page # 시스템을 초기상태로 만든다. Input Username demo # 시스템을 초기상태로 만든다. Input Password mode # 시스템을 초기상태로 만든다. Submit Credentials # 시스템에 Action 을 수행한다. Welcome Page Should Be Open # 시스템의 상태가 예상과 맞는지 검증한다. Keyword Driven Style : 키워들을 순차적으로 부르는 워크프로우 형식으로 구성된다. - 시스템을 특정한 초기 상태로 만들고, 시스템에 뭔가를 수행한 후에, 시스템이 상태가 예상과 맞는지 검증한다.
  87. 87. 87 *** Settings *** Test Template Login with invalid credentials should fail *** Test Cases *** USERNAME PASSWORD Invalid User Name invalid ${VALID PASSWORD} Invalid Password ${VALID USER} invalid Invalid User Name and Password invalid invalid Empty User Name ${EMPTY} ${VALID PASSWORD} Empty Password ${VALID USER} ${EMPTY} Empty User Name and Password ${EMPTY} ${EMPTY} *** Test Cases *** Invalid Password [Template] Login with invalid credentials should fail invalid ${VALID PASSWORD} ${VALID USER} invalid invalid whatever ${EMPTY} ${VALID PASSWORD} ${VALID USER} ${EMPTY} ${EMPTY} ${EMPTY} Data-Driven Style : 워크플로우 형식이 아니라, 키워드 하나로 테스트 케이스를 정의한다. 워크플로우는 지정된 키워드에 정의된다. - Settings Table 에서 Test Template 으로 실행할 Keyword 를 정의한다. - Test Cases 에서는 Arguments 들만을 정의한다. - Test Cases 뒤에 패러미터의 이름을 적어주면, 테스트를 이해하는데 도움이 된다. Test Case Styles
  88. 88. 88 Test Case Styles Test Case 에서 [Template] 를 이용한 테스트 케이스 *** Test Cases *** Test Login [Template] Login invalid valid password invalid user invalid password *** Keywords *** Login [Arguments] ${userid} ${password} Log To Console try to login with ${userid}
  89. 89. 89 *** Test Cases *** Add two numbers Given I have Calculator open When I add 2 and 40 Then result should be 42 Add negative numbers Given I have Calculator open When I add 1 and -2 Then result should be -1 Behavior-Driven Style: 요구사항을 프로젝트의 모든 이해관계자들이 이해할 수 있는 테스트케이스로 작성할 수도 있다. 실행가능한 요구사항은 인수테스트 주도개발(Acceptance Test Driven Development)의 핵심 역할을 한다. 이런 테스트 케이스를 BDD(Behavior Driven Development) 형식으로 지정할 수 있다. - Given: 시스템의 초기 상태를 지정할 때 사용한다. - When: 시스템에 수행하는 Action 을 지정할 때 사용한다. - Then: 예상되는 결과를 검증할 때 사용한다. - And, But : 하나 이상의 행동을 기술할 때 사용한다. - Given, When, Then, And, But 은 키워드를 매칭할 때 무시된다. *** Keywords *** I have ${program} open Start Program ${program} I add ${number 1} and ${number 2} Input Number ${number 1} Push Button + Input Number ${number 2} Push Button = Result should be ${expected} ${result} = Get Result Should Be Equal ${result} ${expected} Test Case Styles
  90. 90. 90 *** Keywords *** Select ${animal} from list Open Page Pet Selection Select Item From List animal_list ${animal} Embedded Argument *** Keywords *** Select cat from list Open Page Pet Selection Select Item From List animal_list cat Select dog from list Open Page Pet Selection Select Item From List animal_list dog *** Keywords *** Select from list [Arguments] ${animal} Open Page Pet Selection Select Item From List animal_list ${animal} <Arguments 방식> <Keyword Embedded Arguments 방식> Test Case Styles
  91. 91. 91 Keyword Argument Embedding Arguments - 지정방식 : 키워드에 ${argument} 를 직접 정의한다. - Embedded Argument 의 제약 - [Arguments] 를 사용할 수 없다. - 선택적인 Argument 를 사용할 수 없다. - 가변 길이 Argument 를 사용할 수 없다. - 패턴 사용하기 - ${argument:pattern} - pattern 은 Python 의 Regular Expression *** Keywords *** Select ${animal} from List Log To Console ${animal} <Embedded Argument 정의하기> *** Test Cases *** Test Select Team Los Angeles Lakers *** Keywords *** Select Team ${city} ${team} Log To Console ${team} in ${city}
  92. 92. 92 Keyword Argument 변수 설명 . 개행문자를 제외한 모든 문자와 일치한다. ex) a.b 와 일치하는 문자열 : aab, abb, acb, ... ^ 문자열의 처음. 라인의 처음과 일치한다. ex) ^ab* 와 일치하는 문자열 : ab 로 시작하는 문자열 혹은 줄 $ 문자열의 맨 마지막, 라인의 마지막과 일치한다. ex) .*ab$ 와 일치하는 문자열 : ab 로 끝나는 문자열 혹은 줄 * 바로 앞의 패턴과 0번 이상 일치하다. ex) ab* 와 일치하는 문자열 : a, ab, abb, abbb, …. + 바로 앞의 패턴과 1번 이상 일치한다. ex) ab+ 와 일치하는 문자열 : ab, abb, abbb, abbbb…. ? 바로 앞의 패턴과 0번 혹은 1번 일치한다. ex) ab? 과 일치하는 문자열 : a, ab [...] [ ] 안에 있는 문자 하나와 같으면 일치 : ex) [abc] 와 일치하는 문자열 : a, b, c [abcs-z] 와 일치하는 문자열 : a,b,c,s,t,u,v,w,x,y,z | A|B : A, B 둘 중 하나. A,B 는 정규표현식. (expression) 괄호안의 정규표현식(expression)과 일치하는 문자를 추출한다. 일치하는 문자열을 number 와 같이 사용할 수 있다. (?iLmsux) 이 그룹은 empty string 과 일치하고, 정규표현식 전체와 일치시킬 때 option 을 지정한다. i: Ignore case, L: locale dependent, m:multiline, s:dot 이 모두 일치, u:유니코드 dependent, x: verbose 더 자세한 내용은 https://docs.python.org/2/library/re.html 참조 Embedded Argument 에 사용할 수 있는 정규 표현식
  93. 93. 93 Keyword Argument Embedded Argument 에서 사용할 수 있는 정규 표현식 변수 설명 number 개행문자를 제외한 모든 문자와 일치한다. ex) a.b 와 일치하는 문자열 : aab, abb, acb, ... A 문자열의 처음과 일치한다. b 문자열의 맨 마지막, 라인의 마지막과 일치한다. ex) .*ab$ 와 일치하는 문자열 : ab 로 끝나는 문자열 혹은 줄 B 바로 앞의 패턴과 0번 이상 일치하다. ex) ab* 와 일치하는 문자열 : a, ab, abb, abbb, …. d 숫자와 일치한다. D 수자가 아닌 문자와 일치한다. [^0-9] 와 같다. s 공백 문자와 일치한다. [ tnrfv] S 공백이 아닌 문자와 일치한다. w 알파벳과 숫자, 밑줄(underscore)와 일치한다. [a-zA-Z0-9_] W 알파벳, 숫자, 밑줄이 아닌 문자와 일치한다. [^a-zA-Z0-9_] z 문자열의 끝과 일치한다. 더 자세한 내용은 https://docs.python.org/2/library/re.html 참조
  94. 94. 94 Keyword Argument *** Test Cases *** Example I execute "ls" I execute "ls" with "-lh" I type 1 + 2 I type 53 - 11 Today is 2011-06-27 *** Keywords *** I execute "${cmd:[^"]+}" Run Process ${cmd} shell=True I execute "${cmd}" with "${opts}" Run Process ${cmd} ${opts} shell=True I type ${a:d+} ${operator:[+-]} ${b:d+} Calculate ${a} ${operator} ${b} Today is ${date:d{4}-d{2}-d{2}} Log ${date}
  95. 95. 95 Keyword Argument *** Test Cases *** Example I execute "ls" I execute "ls" with "-lh" I type 1 + 2 I type 53 - 11 Today is 2011-06-27 *** Keywords *** I execute "${cmd:[^"]+}" Run Process ${cmd} shell=True I execute "${cmd}" with "${opts}" Run Process ${cmd} ${opts} shell=True I type ${a:d+} ${operator:[+-]} ${b:d+} Calculate ${a} ${operator} ${b} Today is ${date:d{4}-d{2}-d{2}} Log ${date}
  96. 96. 96 Resource File *** Settings *** Documentation An example resource file Library Selenium2Library Resource ${RESOURCES}/common.robot *** Variables *** ${HOST} localhost:7272 ${LOGIN URL} http://${HOST}/ ${WELCOME URL} http://${HOST}/welcome.html ${BROWSER} Firefox *** Keywords *** Open Login Page [Documentation] Opens browser to login page Open Browser ${LOGIN URL} ${BROWSER} Title Should Be Login Page Input Name [Arguments] ${name} Input Text username_field ${name} Input Password [Arguments] ${password} Input Text password_field ${password} 여러 Test Suite 에서 공통적으로 사용되는 변수 혹은 키워드를 정의한다. - Resource 가 필요한 Test Case 파일에서 불러서 사용한다. - Settings, Variables, Keyword 를 정의할 수 있다. - Test Cases 는 정의할 수 없다.
  97. 97. 97 Variable File 여러 Test Suite 에서 공통적으로 사용되는 변수들을 모아놓고, 각 Test Case File 에서 불러서 사용한다. 변수 파일을 불러올 때, Python 모듈로 불러들인다(import). 변수 이름은 대소문자를 구분하지 않지만, 글로벌 변수인 경우에는 대문자만 사용할 것을 권장한다. VARIABLE = "An example string" ANOTHER_VARIABLE = "This is pretty easy!" INTEGER = 42 STRINGS = ["one", "two", "kolme", "four"] NUMBERS = [1, INTEGER, 3.14] MAPPING = {"one": 1, "two": 2, "three": 3}
  98. 98. 98 *** Settings *** Test Timeout 2 minutes *** Test Cases *** Default Timeout [Documentation] Timeout from the Setting table is used Some Keyword argument Override [Documentation] Override default, use 10 seconds timeout [Timeout] 10 Some Keyword argument Custom Message [Documentation] Override default and use custom message [Timeout] 1min 10s This is my custom error Some Keyword argument Variables [Documentation] It is possible to use variables too [Timeout] ${TIMEOUT} Some Keyword argument No Timeout [Documentation] Empty timeout means no timeout even when Test Timeout has been used [Timeout] Some Keyword argument No Timeout 2 [Documentation] Disabling timeout with NONE works too and is more explicit. [Timeout] NONE Some Keyword argument Timeout 테스트 케이스/키워드는 지정된 시간안에 실행되지 못하면 실패한 것으로 간주되고 실행이 중지된다.
  99. 99. 99 Web Application Test 1. 도구 설치하기 2. Locators 3. 테스트 케이스 작성
  100. 100. 100 도구 설치하기 구분 용도 RIDE RobotFramework 테스트를 편집하기 위한 IDE RIDE 는 wxPython 에서 동작하기 때문에, wxPython 을 설치해야 한다. Selenium2Library RobotFramework 에서 Selenium 을 사용하기 위해 필요한 Library Selenium Selenium 라이브러리. Selenium2Library 가 설치될 때 같이 설치되기 때문에 별도 설치 필요없음 웹 브라우저 드라이버 Firefox Driver : Selenium2Library 에 기본적으로 내장되어 있기 때문에 별도 설치 필요 없음 Chrome Driver : 별도 설치 필요함 IE Driver : 별도 설치 필요함 Selenium IDE Record & Playback 을 지원하는 Firefox Plugin 으로, 웹 브라우저 웹 Applicaion 을 테스트할 때 사용할 웹 브라우저 (Firefox, Chrome 등 설치)
  101. 101. 101 RIDE 설치하기 설치 하기 1. Command 창에서 “pip install robotframework” 을 실행한다. 설치 확인 1. Command 창에서 ride.py 명령을 실행한다. <robotFramework-ride 설치 화면> <ride.py 정상 설치시 실행 화면>
  102. 102. 102 wxPython 설치하기 설치 하기 1. http://sourceforge.net/projects/wxpython/files/wxPython/2.8.12.1 접속한다. 2. wxPython2.8-win64-unicode-2.8.12.1…...exe 를 다운받는다. 3. 다운받은 파일을 설치한다.
  103. 103. 103 wxPython 설치하기 설치 확인 1. Command 창에서 ride.py 명령을 실행한다. 2. RIDE 화면이 보이면 wxPython 설치 완료
  104. 104. 104 Selenium2Library 설치 하기 1. Command 창에서 pip install robotframework-selenium2library 실행 설치확인하기 1. Command 창에서 Python 을 실행한다. 2. Python 창에서 “from selenium import webdriver” 를 실행한다. 3. 오류가 뜨지 않으면 설치 완료
  105. 105. 105 Selenium 설치 확인 Selenium 설치 확인하기 1. Firefox ( Firefox 46.0.1 버전) 를 다운받아 설치한다. a. 최신 버전인 Firefox 47.0 버전은 현재 지원되지 않음 2. Python 창에서 아래 명령어를 실행한다. a. from selenium import webdriver b. webdriver.Firefox() 3. Firefox 브라우저가 화면에 나타나면, Selenium 설치 완료
  106. 106. 106 ChromeDriver 설치 ChromeDriver 설치 1. Chrome 브라우저를 다운받아 설치한다. 2. https://sites.google.com/a/chromium.org/chromedriver/downloads 에 접속한다. 3. 최신 ChromeDriver 를 다운받는다. 4. 다운받은 파일의 압축을 풀고 디렉토리(chromedriver_win32)를 C: 아래로 복사한다. 5. 시스템 속성에서 Path 환경변수에 “C:chromedriver_win32” 경로를 추가한다. ChromeDriver 설치 및 경로 설정확인하기 1. Command 창을 새로 실행한다. 2. Command 창에서 chromedriver 명령어를 입력한다. 3. Ctrl+C 를 입력해서 chromedriver 를 중지한다. Chrome/Selenium 연동 확인하기 1. Google Chrome 브라우저를 다운받아 설치한다. 2. Python 창에서 아래 명령어를 실행한다. a. from selenium import webdriver b. webdriver.Chrome() 3. Chrome 브라우저가 화면에 나타나면, ChromeDriver 과 Selenium 연동 완료
  107. 107. 107 IE Driver 설치 IE Driver 설치 1. http://selenium-release.storage.googleapis.com/index.html 에 접속 2. 최신 버전을 다운받는다. ( IEDriverServer_x64_2.53.1.zip ) 3. 다운받은 파일의 압축을 푼 디렉토리(IEDriverServer_x64_2.53.1)를 C: 아래로 복사한다. 4. 시스템 속성의 Path 환경 변수에 “C:IEDriverServer_x64_2.53.1” 를 추가한다. IE Driver 설치 및 Path 확인하기 1. Command 창에서 IEDriverServer_x64_2.53.1 를 입력한다. 2. 아래 화면처럼 동작하면 IE Driver 설치 완료 3. Ctrl+C 를 입력해서 IEDriverServer 를 중지한다. IE Selenium 연동 확인하기 1. Python 창에서 아래 명령어를 실행한다. a. from selenium import webdriver b. webdriver.Ie() 2. IE 브라우저가 화면에 나타나면, IE와 Selenium 연동 완료
  108. 108. 108 브라우저 열기 실습 : Selenium2Library 키워드를 이용하여 로그인 테스트를 자동화하는 테스트 케이스를 작성한다. 목적 - Selenium2Library 의 키워드를 이용하여 자동화된 테스트케이스를 작성할 수 있다.
  109. 109. 109 브라우저 열기 *** Settings *** Library Selenium2Library *** Test Cases *** Add Open Browser http://www.site.you.want Chrome
  110. 110. 110 실습-계산기 테스트 실습 : 계산기 Web Application 이 정상 동작하는지 테스트한다. 목록 - 다양한 Locator 지정 방법을 이해하고 활용할 수 있다. - Web Element 의 Locator 를 파악할 수 있다.
  111. 111. 111 브라우저 열기 *** Settings *** Library Selenium2Library *** Test Cases *** Add Open Browser file:///…….../robot/Calculator/calculator.html Chrome Click Element xpath=//button[text()='1'] Click Element xpath=//button[text()='+'] Click Element xpath=//button[text()='2'] Click Element xpath=//button[text()='='] Get Text xpath=//button[text()='2']
  112. 112. 112 Locators Selenium2Library 의 키워드들은 페이지에 있는 Element 를 찾기 위한 패러미터가 필요하다. - 이 패러미터를 Locator ( webelement locator ) 라고 한다. - Locator 는 Element 를 찾는 방법을 지정한다. - Element 를 찾는 전략에 따라 지정 방법이 다르다.
  113. 113. 113 WebElement Locators Strategy Example Description identifier Click Element | identifier=my_element Matches by @id or @name attribute id Click Element | id=my_element Matches by @id attribute name Click Element | name=my_element Matches by @name attribute xpath Click Element | xpath=//div[@id='my_element'] Matches with arbitrary XPath expression dom Click Element | dom=document.images[56] Matches with arbitrary DOM express link Click Element | link=My Link Matches anchor elements by their link text partial link Click Element | partial link=y Lin Matches anchor elements by their partial link text css Click Element | css=div.my_class Matches by CSS selector jquery Click Element | jquery=div.my_class Matches by jQuery/sizzle selector sizzle Click Element | sizzle=div.my_class Matches by jQuery/sizzle selector tag Click Element | tag=div Matches by HTML tag name default* Click Link | default=page?a=b Matches key attributes with value after first '=' Selenium 에서 Web Element 를 지정하는 문자열을 Locator 라고 한다. ( | 는 탭구분자 )
  114. 114. 114 XPath XPath 를 이용하여 Web Element 를 지정할 수 있다. XPath 설명 nodenam e node 의 이름이 nodename 인 모든 노드를 선택한다. / root node 를 선택한다. // 현재노드에서 문서에 있는 노드들을 선택한다. . 현재 노드를 선택한다. .. 현재 노드의 패부모 노드를 선택한다. @ 속성을 선택한다. * 모든 노드 @* 속성을 가진 모든 노드 node() 모든 노드
  115. 115. 115 XPath XPath 예제 예제 설명 bookstore 이름이 bookstore 인 node 를 모두 선택한다. /bookstore /bookstore 노드를 선택한다. bookstore/book book child 노드를 가진 bookstore 노드를 선택한다. //book 모든 book 노드를 선택한다. bookstore//book bookstore 노드 하위의 모든 book 노드를 선택한다. //@lang 모든 노드의 lang 속성을 선택한다.
  116. 116. 116 XPath XPath Predicate : 여러 노드들 중에서 특정 노드나, 특정 값을 가진 노드를 선택할 때 Predicate 을 사용한다. - predicate 은 항상 [ ] 안에 명시한다. 예제 설명 /bookstore/book[1] /bookstore 노드의 child 인 book 노드중 첫번째 노드 ( IE 는 0번 부터, W3C 표준은 1번부터 ) /bookstore/book[last()] /bookstore 노드의 child 인 book 노드중 마지막 노드 /bookstore/book[last()-1] /bookstore 노드의 child 인 book 노드중 마지막 이전 노드 /bookstore/book[position()<3] /bookstore 노드의 child 인 book 노드중 첫번째 두 노드 bookstore//book bookstore 노드 하위의 모든 book 노드를 선택한다. //title[@lang] lang 속성이 있는 title 노드 //title[@lang=’en’] lang 속성의 값이 ‘en’ 인 title 노드 /bookstore/book[price<3] /bookstore 의 child book 노드 중, book/price 노드의 값이 3보다 작은 노드 /bookstore/book[price<3]/title /bookstore 의 child book 노드 중, book/price 노드의 값이 3보다 작은 노드의 title 노드 * 모든 노드를 선택 @* 속성을 가진 모든 노드 node() 모든 노드 //book[text()=’A’] book 노드의 텍스트가 ‘A’ 인 모든 book 노드
  117. 117. 117 예제 설명 .intro class="intro" 인 모든 element #firstname id="firstname" 인 모든 element * 모든 element p 모든 <p> element div, p 모든 <div>,<p> element div p <div> 안에 있는 모든 <p> element div > p 부모가 <div> 인 모든 <p> div + p <dive> 바로 다음에 정의된 <p> p ~ ul 앞에 <p> 가 있는 모든 <ul> [target] target 속성이 있는 모든 element [target=_blank] target="_blank"인 모든 element [title~=flower] title 속성값에 "flower" 를 포함하는 모든 element [lang|=en] lang 속성이 en 으로 시작하는 element CSS Selector css=값 형식으로 element 를 지정한다. ( http://www.w3schools.com/cssref/css_selectors.asp 참조 ) http://www.nextree.co.kr/p8468/
  118. 118. 118 CSS Selector css=값 형식으로 element 를 지정한다. ( http://www.w3schools.com/cssref/css_selectors.asp 참조 ) 예제 input:checked checked <input> element input:disabled disabled <input> element input:enabled enabled <input> element input:focus focus 를 가진 input element input:in-range 지정된 range 안에 있는 input element input:invalid 유효하지 않은 value 를 가진 입력 element input:optional required 속성이 없는 input element input:out-of-range 지정된 range 밖에 있는 input element input:read-only readonly 속성의 명시된 input element input:read-write readonly 속성이 명시되지 않은 input element input:required required 속성을 가진 input element input:valid 유효한 값을 가진 input element
  119. 119. 119 예제 a[href^="https"] href 속성이 https 로 시작하는 <a> element a[href$=".pdf"] href 속성이 .pdf 로 끝나는 <a> element a[href*=" w3schools"] href 속성에 w3cschools 로 포함한 <a> element a:active active link a:hover Selects links on mouse over a:link Selects all unvisited links a:visited Selects all visited links CSS Selector css=값 형식으로 element 를 지정한다. ( http://www.w3schools.com/cssref/css_selectors.asp 참조 )
  120. 120. 120 CSS Selector css=값 형식으로 element 를 지정한다. ( http://www.w3schools.com/cssref/css_selectors.asp 참조 ) 예제 설명 p:empty text 노드도 없고 자식 노드도 없는 <p> element p:first-child p:last-child p:nth-child(2) p:nth-last-child(2) <p> 가 첫번째 child 인 <p> 노드들 <p> 가 마지막 child 인 <p> 노드들 <p> 가 두번째 child 인 <p> 노드들 <p> 가 거꾸로 두번째 child 인 <p> 노드들 p::first-letter <p> 의 첫번째 문자 p::first-line <p> 의 첫번째 줄 p:first-of-type p:last-of-type p:nth-of-type(2) p:nth-last-of-type(2) <p> 의 부모의 첫번째 요고사 <p>인 모든 <p> <p> 의 부모의 마지막 요소가 <p>인 모든 <p> <p> 의 부모의 두번째 요소가 <p>인 모든 <p> <p> 의 부모의 끝에서 두번째 요소가 <p>인 모든 <p> p:lang(it) lang 속성이 “it” 인 <p> :not(p) <p> 가 아닌 모든 element 들 p:only-of-type <p> 만을 가진 부모의 모든 <p> (<p> 가 여러개라도 true ) p:only-child child 노드가 <p> 딱 하나밖에 없는 모든 <p> :root Document 의 root element ::selection 사용자가 선택한 element 들
  121. 121. 121 jQuery Selector jQuery=xxx 와 같이 사용함 셀렉터 문법 문법 설명 * 문서의 모든 element div 모든 div element div a div 안에 있는 a element div>a div 의 자식 노드 중 a element div+a div 바로 다음에 나오는 a element div~ul div 다음에 나오는 모든 ul element div:has(a) 자손중에 a 태그가 하나 이상인 div div.classname class 가 classname 이 모든 div ( .classname = *.classname 과 동일 ) div#idname 아이디가 idname 인 div div[lang=’en’] lang 속성 값이 ‘en’ 인 div div[lang^=’en’] lang 속성 값이 ‘en’ 으로 시작하는 div div[lang$=’en’] lang 속성 값이 ‘en’ 으로 끝나는 div div[lang*=’en’] lang 속성 값에 ‘en’ 을 포함하는 div div[lang] lang 속성이 있는 div
  122. 122. 122 jQuery Selector Selenium 에서 Web Element 를 지정하는 문자열을 Locator 라고 한다. ( | 는 탭문자임 ) 셀렉터 문법 문법 설명 div:first 모든 div 엘리먼트중 맨 처음 div 엘리먼트 div:last 모든 div 엘리먼트중 맨 마지막 div 엘리먼트 div:first-child div 의 첫번째 자식 엘리먼트 div:last-child div 의 첫번째 마지막 엘리먼트 div:only-child 형제가 없는 div 엘리먼트 div:nth-child(n) div 엘리먼트의 부모 엘리먼트를 기준으로 두번째 div div:nth-child(even or odd) div 엘리먼트의 부모 엘리먼트를 기준으로 짝수(even)/홀수(odd)번째 div div:even or div:odd 전체 div 노드 중에서 짝수(even) 혹은 홀수(odd)번째 엘리먼트 div:eq(n) 선택된 div 중에서 n번째 div div:gt(n) 선택된 div 중에서 n 보다 큰 div div:lt(n) 선택된 div 중에서 n 보다 작은 div
  123. 123. 123 jQuery Selector 셀렉터 문법 문법 설명 :animated 현재 애니매이션이 적용되고 있는 엘리먼트 선택 :button 모든 버튼 선택 :checkbox 체크 박스 엘리먼트만 선택 (input[type=checkbox]) :checked 선택된 체크 박스나 라디오 버튼만을 선택 :contains(foo) 텍스트 foo를 포함하는 엘리먼트만 선택 :disabled 인터페이스에서 비활성화 상태인 모든 폼 엘리먼트를 선택 :enabled 인터페이스에서 활성화 상태인 모든 폼 엘리먼트를 선택 :file 모든 파일 엘리먼트를 선택 (input[type=file]) :header 헤더 엘리먼트 선택 (<h1>~<h6>) :hidden 감춰진 엘리먼트만 선택 :image 폼 이미지만 선택 (input[type=image]) :input 폼 엘리먼트만 선택 (input, select, textarea, button) :not(filter) 필터의 값을 반대로 변경함. :parent 빈 엘리먼트를 제외하고, 텍스트도 포함해서 자식 엘리먼트를 가지는 엘리먼트 :password 패스워드 엘리먼트 선택 (input[type=password]) :radio 라디오 엘리먼트 선택 (input[type=radio]) :reset 리셋 버튼을 선택 (input[type=reset] or button[type=reset]) :selected 선택된 엘리먼트만 선택 :submit 전송 버튼을 선택 (input[type=submit] or button[type=submit]) :text 텍스트 엘리먼트만 선택 (input[type=text]) :visible 보이는 엘리먼트만 선택
  124. 124. 124 Selenium IDE 설치 Selenium IDE 설치하기 1. Firefox 를 실행한다. 2. https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ 에 접속한다. 3. “Add to Firefox” 버튼을 클릭해서 Selenium IDE 를 설치하고 Firefox 를 재시작한다. 1.
  125. 125. 125 Selenium IDE 설치 Selenium IDE 설치 확인 1. Firefox 주소창에 “about:addons” 를 입력한다. 2. Extensions 를 클릭하고, “Selenium IDE” 가 표시되는지 확인한다.
  126. 126. 126 Selenium IDE Record & Playback 지원 - Firefox 브라우저에서만 실행 - Web Element 의 Locator 를 파악하는데 유용 기록녹화/중지 버튼 - 녹화모드 : 브라우저의 Action 을 모두 기록 Target Element 찾기
  127. 127. 127 Selenium IDE 파일 > Export Test Case As 에서 다양한 테스트 코드를 생성할 수 있음
  128. 128. 128 Local 환경에서 테스트하기 Web Application (혹은) 페이지를 내 로컬 환경에서 테스트하고 싶은 경우 - 테스트하고 싶은 페이지를 로컬에 html 문서로 다운받아서 테스트할 수 있다. - wget version 1.18 이상을 사용한다. - wget windows 1.18 버전 다운로드하기 - 1. Google 에서 “wget windows 1.18” 을 검색한다. - 2. https://eternallybored.org/misc/wget/ 로 이동한다. - 3. 원하는 버전(32비트, 64비트)을 wget.exe 를 다운받는다. - wget 파일 복사하기 - 32비트를 다운받은 경우 - c:program files(x86)Wget 디렉토리를 만들고 복사한다. - 64비트를 다운받은 경우 - c:program filesWget 디렉토리를 만들고 복사한다. - 경로설정하기 - PATH 환경변수에 Wget 을 복사한 디렉토리 경로를 추가한다. - 확인하기 - Command 창을 새로 실행한 후에, wget 을 입력해서 실행되는지 테스트한다.
  129. 129. 129 Local 환경에서 테스트하기 Command 창의 코드 페이지 확인하기 - Command 창의 Caption Bar (제목이 있는 창)에서 오른쪽 버튼을 누르고, 속성을 선택한다. - “명렬 프롬프트” 속성의 현재 코드 페이지를 확인한다.
  130. 130. 130 Local 환경에서 테스트하기 Command 창의 코드 페이지를 바꾸기 - Command 창에서 아래 명령을 실행해서, 코드 페이지를 UTF-8로 바꾼다. - C:UserJaehoon> CHCP 65001
  131. 131. 131 Local 환경에서 테스트하기 브라우저에서 테스트하고 싶은 웹 페이지로 이동합니다. - 브라우저 주소창에서 URL 을 복사합니다. - Command 창에서 아래 명령어를 입력합니다. - wget -k -r -np --local-encoding=utf-8 --restrict-file-names=windows “URL” - 실행 결과 확인 - URL 의 도메인 디렉토리가 생성되었는지 확인합니다. - URL 의 도메인 디렉토리 아래 파일이 생성되었는지 확인합니다.
  132. 132. 132 다음 계산기 테스트 자동화 1. 다음(www.daum.net)에 접속한다. 2. 검색어창에 “계산기"를 입력한다. 3. URL 을 복사한다. 4. wget 을 실행해서 계산기 페이지를 로컬에 다운받는다. 5. 다운된 파일 이름을 Calculator.html 로 변경한다.
  133. 133. 133 다음 계산기 테스트 자동화 Legacy Application Test : 이미 완성된 기능들에 대한 테스트를 자동화한다. 실습 : 더하기 계산이 정상적으로 동작하는지 확인한다. 생각해야 할 것들 - 더하기 계산이 정상 동작한다는 것을 증명하려면 얼마나 많이 테스트해야 하는가? a. 한자리수 더하기만 하더라도 10x10 = 100 개 조합이 만들어진다. b. 두자리수는 100 x 100 = 10000개 조합이 가능하다. c. 이 모든 조합을 테스트해야 하는가? - 모든 조합을 테스트하는 것을 불가능하다. - SW 를 테스트하는 이유는?
  134. 134. 134 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html *** Test Cases *** # 1 + 2 = 3 Add Numbers with Single Digit Click Element //button[text()='1'] Click Element //button[text()='+'] Click Element //button[text()='2'] Click Element //button[text()='='] ${result}= Get Value jQuery=#calculatorColl .box_result .num_result .tf_comm Should Be Equal As Strings ${result} 3 한자리 덧셈이 정상 동작하는지 확인한다.
  135. 135. 135 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html *** Test Cases *** # 1 + 2 = 3 Add Numbers with Single Digits Add Single Digit Numbers 1 2 Add Single Digit Numbers 3 4 Add Single Digit Numbers 5 6 *** Keywords *** Add Signgle Digit Numbers [Arguments] ${augend} ${addend} Click Element //button[text()='${augend}'] Click Element //button[text()='+'] Click Element //button[text()='${addend}'] Click Element //button[text()='='] ${result}= Get Value jQuery=#calculatorColl .box_result .num_result .tf_comm Should Be Equal As Strings ${result} 3 한자리 덧셈이 정상 동작하는지 확인한다. - 여러 번 반복되는 경우, 사용자 정의 키워드를 만들어서 추상화 레벨을 높인다.
  136. 136. 136 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html Chrome Test Template Add Single Digit Numbers *** Test Cases *** Single Digit Numbers(1+2) 1 2 Single Digit Numbers(3+4) 3 4 Single Digit Numbers(5+6) 5 6 *** Keywords *** Add Signgle Digit Numbers [Arguments] ${augend} ${addend} Click Element //button[text()='${augend}'] Click Element //button[text()='+'] Click Element //button[text()='${addend}'] Click Element //button[text()='='] ${result}= Get Value jQuery=#calculatorColl .box_result .num_result .tf_comm Should Be Equal As Strings ${result} 3 각각의 테스트 케이스를 별개로 만들고 싶다면, Test Template 을 이용한다.
  137. 137. 137 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html Chrome *** Test Cases *** Add Numbers with Single Digits [Template] Add Signgle Digit Numbers Single Digit Numbers(1+2) 1 2 Single Digit Numbers(3+4) 3 4 Single Digit Numbers(5+6) 5 6 *** Keywords *** Add Signgle Digit Numbers [Arguments] ${augend} ${addend} Click Element //button[text()='${augend}'] Click Element //button[text()='+'] Click Element //button[text()='${addend}'] Click Element //button[text()='='] ${result}= Get Value jQuery=#calculatorColl .box_result .num_result .tf_comm Should Be Equal As Strings ${result} 3 Test 안에 Template 을 이용하기
  138. 138. 138 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html Chrome *** Test Cases *** [Technical Activity] Add Numbers with Double Digits Click Element //button[text()='1'] Click Element //button[text()='2'] Click Element //button[text()='+'] Click Element //button[text()='4'] Click Element //button[text()='6'] Click Element //button[text()='='] ${result}= Get Value jQuery=#calculatorColl .box_result .num_result .tf_comm Should Be Equal As Strings ${result} ${expected_value} Technical Activity 로 기술하기
  139. 139. 139 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html Chrome *** Test Cases *** Add Numbers with Double Digits A user enter a number 12 A user enter plus A user enter a number 34 Result Should Be 46 *** Keywords *** A user enter a number [Arguments] ${number} ${length}= Get Length ${number} :FOR ${index} IN RANGE ${length} Click Element //button[text()='${number[${index}]}'] A user enter plus Click Element //button[text()='+'] Result Should Be [Arguments] ${expected_value} Click Element //button[text()='='] ${result}= Get Value jQuery=#calculatorColl .box_result .num_result .tf_comm Should Be Equal As Strings ${result} ${expected_value} Workflow 로 기술하기
  140. 140. 140 다음 계산기 테스트 자동화 *** Settings *** Library Selenium2Library Suite Setup Open Browser file://.../Calculator/calculator.html Chrome *** Test Cases *** Add Numbers with Sigle Digit Number 1 Plus Number 2 Should Be Equal 3 *** Keywords *** Number [Arguments] ${number} A user enter a number ${number} Plus A user enter plus Should Be Equal [Arguments] ${expected_value} Result Should Be ${expected_value} 비즈니스 규칙으로 기술하기
  141. 141. 141 IV. Command Line Options 1. Command Line Options
  142. 142. 142 옵션 설명 -N, --name <name> Top-level Test Suite 이름을 지정한다. -D, -d <document> Top-level Test Suite document 지정한다. -M, --metadata <name:value> Top-level test suite metadat 를 설정한다. -G, --settag <tag> 실행된 모든 test case 들의 tag 를 지정한다. -t, --test <name> 테스트 케이스를 이름으로 선택한다. -s, --suite <name> 테스트 슈트를 이름으로 선택한다. -i, --include <tag> 지정된 tag 를 포함한 테스트 케이스만 실행한다. -e, --exclude <tag> 지정된 tag 를 포함한 테스트 케이스만 실행하지 않는다. -c, --critical <tag> 지정된 tag 를 포함한 테스트 케이스들은 critical 한 테스트 케이스로 간주한다. -n, --noncritical <tag> 지정된 tag 를 포함한 테스트 케이스들은 critical 하지 않은 테스트 케이스로 간주한다. -v, --variable <name:value> variable 을 설정한다. -V, --variablefile <path:args> variable files 를 이용하여 variable 을 설정한다. -d, --outputdir <dir> 출력 파일들을 저장할 디렉토리를 지정한다 Command Line Options
  143. 143. 143 옵션 설명 -o, --output <file> output 을 저장할 파일 경로를 지정한다. -l, --log <file> 실행 log 를 기록할 파일 경로를 지정한다. -r, --report <file> report 를 저장할 파일 경로를 지정한다. -x, --xunit <file> xUnit 형식의 결과를 저장할 파일 경로를 지정한다. --xunitskipnoncritical non-critical 한 테스트를 xUnit 형식 결과 파일에서 제외한다. -b, --debugfile <file> 디버그 용 파일 경로를 지정한다. -T, --timestampoutputs 모든 출력 파일들에 timestamp 를 추가한다. --splitlog log file 을 더 작은 파일로 쪼개서 저장한다. --logtitle <title> 생성된 테스트 로그의 제목을 지정한다. --reportitle <title> 생성된 테스트 리포트의 제목을 지정한다. -L, --loglevel <level> 로깅 thredshold 를 지정한다. --suitestatlevel <level> --tagstatinclude <tag> 지정된 tag 를 가진 테스트 케이스들만 통계에 포함한다. Command Line Options
  144. 144. 144 옵션 설명 --tagstatexclude <tag> 지정한 tag 를 가진 테스트 케이스들은 통계에서 제외한다. --tagstatcombine <tags:title> tags 들을 이용해서 통계를 조합한다. --tagdoc <pattern:doc> 지정된 테그들에 대한 documentation 을 추가한다. --tagstatlink <pattern:link:title> 통계에 외부 링크를 추가한다. --removekeywords <all/passed/name:pattern/tag: pattern/for/wulks> 로그 파일에서 키워드를 제거한다. --flattenkeywords <for/foritem/name:pattern/tag: pattern> 로그 파일에 Keyword 를 flatten 한다. --listener <name:args> 테스트 실행을 모니터링하기 위한 리스너를 설정한다. --warnonskippedfiles 내용이 잘못된 파일들을 skip 할 때, 경고 메시지를 보여준다. --nostatusrc 테스트 케이스가 실패하더라도 프로세스의 반환코드로 0(성공)을 돌려준다. 보통은 Error 코드가 반환된다. --runemptysuite 지정한 테스트 슈트가 비어 있는 것처럼 테스트를 실행한다. --dryrun 테스트 라이브러리들에 있는 키워드를 실행하지 않은 상태에서 테스트 케이스를 실행한다. 테스트 데이터 문법을 검사하는데 유용하다. Command Line Options
  145. 145. 145 옵션 설명 --exitonfailure critical 테스트 케이스가 실패하면 더 이상 테스트 실행을 멈춘다. --exitonerror 테스트 데이터를 parsing 하거나, 라이브러리를 import 하는 과정에서 오류가 발생하면 테스트 실행을 멈춘다. --skipteardownonexit 테스트 실행이 중지될 때, teardown 을 실행하지 않는다. --prerunmodifier <name:args> 테스트 데이터의 programmatic 변경을 활성화한다. --prerebotmodifier <name: args> 결과의 programmatic 변경을 활성화한다. --randomize <all/suites/tests/none> 테스트 실행 순서를 랜덤하게 한다. ( 테스트가 랜덤하게 실행되도록 한다. ) --console <verbose/dotted/quiet/none> 콘솔 출력 형식을 결정한다. --dotted --console dotted 의 short cut --quiet --console quite 의 short cut -W, --consolewidth <width> 콘솔 출력의 너비를 지정한다. -C, --consolecolors <auto/on/ansi/off> 콘솔 출력의 색을 지정한다. Command Line Options
  146. 146. 146 옵션 설명 -K, --consolemarkets <auto/on/off> 테스트 케이스에 있는 top level 키워드들이 끝날 때, 콘솔에 마커를 보여준다. -P, --pythonpath <path> python 모듈을 검색할 경로를 추가적으로 지정한다. -E, --escape <what:with> 콘솔 출력시 문제가 발생되는 캐릭터들을 코드로 변환해서 출력한다. -A, --argumentfile <path> 실행시 추가적인 argument 를 읽어올 파일을 지정한다. -h, --help 도움말을 출력한다. --version 버전을 출력한다. Command Line Options
  147. 147. 147 구분 설명 Short Option -X 형식의 Option. 지정한 옵션 뒤에 공백문자를 쓰고 값을 지정 예) % robot -L debug ... Long Option --something 형식의 Option. 지정한 옵션 뒤에 공백문자 혹은 ‘=’ 를 사용해서 값을 지정한다. 예) % robot --loglevel=debug …. % robot --loglevel debug ... 옵션 값을 지정할 때 대부분의 경우, 다음 표와 같은 패턴을 지정할 수 있다. - 패턴 매칭시에는 대소문자를 구분하지 않는다. 구분 설명 * 어떤 문자열과도 일치한다. 예) % pybot --test Invalid* DataDrivenStyle.robot % pybot --test INVALID* DataDrivenStyle.robot ? 한 문자만 일치한다. 예) % pybot --test ?nvalid* DataDrivenStyle.robot RobotFramework 의 Command Line Option 은 Short Option 과 Long Option 으로 구분된다. Command Line Options
  148. 148. 148 Tag Pattern : tag 를 지정할 때, tag pattern 을 사용할 수 있다. - 태그 매칭은 대소문자를 구분하지 않는다. 구분 설명 AND (&) --include fooANDbar : foo, bar 태그가 모두 지정된 테스트 케이스만을 실행한다. --exclude xx&yy&zz : xx,yy,zz 태그가 모두 지정된 테스트 케이스만 제외한다. OR --include foorORbar : foo, bar 태그 둘중 하나 이상 지정된 테스트 케이스를 실행한다. --execlude xxORyyORzz : xx, yy, zz 중에 하나 이상 지정된 테스트 케이스를 제외한다. NOT --include fooNOTbar : foo 태그가 지정된 테스트 케이스 중, bar 가 없는 테스트 케이스를 실행한다. --exclude xxNOTyyNOTzz : xx 가 지정된 테스트 케이스 중, yy 나 zz 가 없는 테스트 케이스를 제외한다. Command Line Options
  149. 149. 149 Command Line Options RobotFramework 는 환경변수에 설정된 값을 기본 Option 으로 사용한다. 명령어 환경변수 사용예 robot ROBOT_OPTIONS % robot --test ?nVALID* DataDrivenStyle.robot 은 % export ROBOT_OPTIONS="--test ?nVALID*" % robot DataDrivenStyle.robot rebot REBOT_OPTIONS % rebot --test ?nVALID* DataDrivenStyle.robot 은 % export REBOT_OPTIONS="--test ?nVALID*" % rebot DataDrivenStyle.robot
  150. 150. 150 Command Line Options Escape Character - Option 값으로 특수값을 사용해야 할 때는 Escape 문자를 사용한다. - 예제) pybot --test ?nvalidSPACEUsername DataDrivenStyle.robot - 기본 Escape 문자 대신 다른 문자를 사용하고 싶을 때는 -E(--escape) 옵션을 사용한다. - 예제) pybot --escape space:_ --test ?nvalid_Username DataDrivenStyle.robot 문자 이름 문자 이름 & amp ( paren1 ' apos ) paren2 @ at % percent bslash | pipe : colon ? quest , comma " quot { curly1 ; semic } curly2 / slash $ dollar space ! exclam [ square1 > gt ] square2 # hash * star < lt
  151. 151. 151 Command Line Options Argument Files - RobotFramework 를 실행할 때마다 옵션을 많이 사용해야 하는 경우에는 자주 사용하는 Option 들을 파일에 지정한 후에, RobotFramework를 실행할 때 Argument 파일을 지정할 수 있다. --doc This is an example (where "special characters" are ok!) --metadata X:Value with spaces --variable VAR:Hello, world! # This is a comment path/to/my/tests 구분 사용 예 Argument 파일 사용 robot --argumentfile all_arguments.robot robot --name Example --argumentfile other_options_and_paths.robot robot --argumentfile default_options.txt --name Example my_tests.robot robot -A first.txt -A second.txt -A third.txt tests.robot 표준 입력으로 받기 generate_arguments.sh | robot --argumentfile STDIN generate_arguments.sh | robot --name Example --argumentfile STDIN tests.robot <Argument 파일 예제>
  152. 152. 152 감사합니다.

×