지식메모/자동화

windows 검색에서 powershell 실행

 

명령어로 get-StartApps 를 입력하면 AppID 확인이 가능하다.

 

get-StartApps

 

참고로 파일 탐색기 AppID 는 

 

파일 탐색기                                Microsoft.Windows.Explorer

 

이렇게 나왔지만 막상 winappdriver에서 가져다 쓸 때는 탐색기 실행 경로(C:\\Windows\\explorer.exe)를 넣어주어야 실행이 되었다.

 

 

 

 

 

 

 

 

 

How to execute winappdriver Tutorial in eclipse with java (CalculatorTest Sample)

 

Winappdriver 공식 Github 주소

https://github.com/microsoft/WinAppDriver

 

microsoft/WinAppDriver

Windows Application Driver. Contribute to microsoft/WinAppDriver development by creating an account on GitHub.

github.com

공식 설명은 아래와 같다

Windows 응용 프로그램 드라이버는 Windows 응용 프로그램에서 Selenium과 유사한 UI 테스트 자동화를 지원하는 서비스입니다. 이 서비스는 Windows 10 PC 에서 UWP (유니버설 Windows 플랫폼) , WinForms (Windows Forms) , WPF (Windows Presentation Foundation)  Win32 (클래식 Windows)  테스트를 지원합니다 . Windows 애플리케이션 드라이버는 JSON 와이어 프로토콜 표준 및 Appium에서 정의한 일부 애플리케이션 관리 기능을 준수 합니다. Appium  사용하여 Windows 응용 프로그램을 테스트 하기위한 더 나은 지원을 찾고 있다면 이 서비스가 적합합니다.

Nodejs와 appium 설치가 필요하다


셋팅 및 사전 준비

1. Windows 10 개발자 모드 켜기

개발자 모드가 켜져있어야 실행이 가능하다. 왜 안되나 한참 삽질을 했었는데 개발자 모드를 안 킨게 문제였다 ;;

윈도우 10 설정 > 업데이트 및 보안 > 개발자용 메뉴에서 개발자 모드를 켜준다.

처음으로 키면 아마 패키지가 설치될 것이다. 설치를 완료되면 개발자 모드를 사용할 수 있다

개발자 모드 첫 실행시
개발자 모드 패키지가 설치된다


2. Winappdriver 설치하기

먼저 아래 링크에서 Winappdriver를 설치해준다

https://github.com/Microsoft/WinAppDriver/releases

 

microsoft/WinAppDriver

Windows Application Driver. Contribute to microsoft/WinAppDriver development by creating an account on GitHub.

github.com

글 작성 시점 1.1 버전을 설치

WindowsApplicationDrive.msi를 받아 설치한다

설치하면 C:\Program Files (x86)\Windows Application Driver 이 경로에 설치가 될 것이다. 해당 경로로 이동하여 WinAppDriver.exe 를 관리자 권한으로 실행해준다. 그럼 아래와 같은 터미널 창이 열린다.

 

Winappdriver.exe 실행 모습

그럼 설치 완료


3. Windows 10 SDK 설치

이건 Windows에서 응용프로그램 요소를 확인하려면 VisualUIVerifyNative를 실행해야한다. 이걸 설치하기 위해서 Windows10 SDK를 설치한다. 아래 링크로 이동하여 SDK를 설치한다. (이미 설치되어 있을 수도 있으니 C:\Program Files (x86)\Windows Kits 경로가 있는지 확인해본다)

https://developer.microsoft.com/ko-kr/windows/downloads/sdk-archive

 

Windows SDK 아카이브 - Windows 앱 개발

세션이 만료되었습니다. 계속하려면 다시 로그인하세요. 저장하지 않은 변경 내용은 손실됩니다.

developer.microsoft.com

SDK도 여러 버전이 있는데 최신 버전을 설치해도 될 것 같으나 현재 사용하고 있는 윈도우 10 버전과 같은 걸로 설치했다. SDK 설치를 클릭하여 설치파일을 받은 후 설치

 

10.0.17134 빌드로 설치

윈도우 버전 확인은 윈도우 검색창에 Windows version 으로 실행하면 시스템 정보 창이 뜨는데 거기서 확인할 수 있다.

 

윈도우 10 버전 확인

 

Windows 10 SDK 설치화면

별다른 설정없이 쭉 넘겨서 설치하였다.

 

이것도 그냥 전부 설치하였다.

 

설치를 하고 나면 C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x86\UIAVerify  이 경로에서 VisualUIAVerifyNative.exe 이 파일을 찾을 수 있다. 실행해보면 아래와 같은 창이 뜬다.

 

VisualUIAVerifyNative.exe  실행 모습

여기서 프로그램의 요소를 확인해볼 수 있다. 그리고 프로그램의 요소를 확인해볼 수 있는 프로그램이 하나 또 있는데 inspect.exe 로 C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86 이 경로에서 실행가능하다. 이게 더 편리한 점은 마우스로 응용프로그램 요소에 이동하거나 클릭하면 자동으로 정보를 보여준다.

 

inspect.exe 실행모습

 

그래서 굳이 VisualUIVerifyNative 처럼 일일이 찾아볼 필요가 없긴 한데 이상하게 자꾸 다운 먹고 멈춰버린다. 원인은 모르겠다..


4. CalculatorTest Samples 예제 다운 받기

https://github.com/microsoft/WinAppDriver 에서 우측 상단 Clone or download 를 클릭하여 내려받는다.

 

Clone or download 클릭하여 내려받기

압축을 풀고 나면 WinAppDriver-1.1\Samples\Java 이 경로에 CalculatorTest 예제 프로젝트를 확인할 수 있다.

 


5. 필요한 라이브러리 다운 받기

※라이브러리 버전은 시점에 따라 다를 수 있음

appium 다운받기 - http://appium.io/downloads.html

Java 클릭 후 다운로드

그러면 java-client-7.2.0.jar 이 다운로드 받아진다.

 

Selenium 라이브러리 다운받기 - https://www.seleniumhq.org/download/

 

버전을 클릭하여 다운로드

selenium-server-standalone-3.141.59.jar이 다운로드 받아진다.


6. Eclipse 에서 프로젝트 셋팅하기

메뉴 [File > New > Java Project]를 선택하고 새로운 프로젝트를 생성.

 

이름만 적어주고 다른 옵션은 건드리지 않음

 

프로젝트 우클릭 > Properties > Java Build Path > Add External JARS.. 클릭하여 아까 받은 appium과 Selenium 라이브러리를 추가해준다.

 

 

그 다음에는 Add Library 클릭하여 Junit 라이브러리를 추가해준다. (Junit 버전은 환경마다 다를 수 있음)

 

JUnit 4 추가된 모습

 

File > New > Package 를 생성해준다.

 

패키지명은 자동으로 되어있다

전에 다운로드 받았던 Calculator 샘플코드를 복사해온다. 경로 WinAppDriver-master\Samples\Java\CalculatorTest\src\test\java\CalculatorTest.java

파일을 winappdriver 패키지 안에 붙여넣어 준다.

 

파일을 붙여넣기 해준다.

그럼 에러가 하나 뜨는데 패키지명이 없어 뜨는 에러이다. 패키지명을 직접 입력해주거나 에러 메시지를 보고 추가해주면 된다.

 

 Add Package 클릭하면 자동으로 패키지 추가하면 > 자동으로 패키지명 입력됨

 

그럼 에러가 사라진다


7. 실행해보기

먼저 Winappdriver.exe를 실행해준다. 경로 C:\Program Files (x86)\Windows Application Driver\Winappdriver.exe

 

Winappdriver.exe 실행 모습

CalculatorTest.java 우클릭 > Run As > JUnit Test 클릭

 

 

그럼 계산기가 실행되는데 만약 java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils 이런 에러가 뜬다면

 

에러 내용

 

http://commons.apache.org/proper/commons-lang/download_lang.cgi 여기 들어가서 파일을 설치해준다.

 

commons-lang3-3.9-bin.zip 다운로드

압축을 풀고 나면 아래 파일이 나오는데 commons-lang3-3.9.jar 파일을 프로젝트 Java Build Path에 추가해준다.

 

추가한 모습

그리고 다시 JUnit Test를 실행하면 계산기가 실행되고 에러가 발생하지 않는다.


8. 에러 수정하기

그런데 문제는 요소를 찾지 못한다는 에러가 뜨는데 

org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. 

 

 

이 원인은 코드가 영문판 계산기로 되어있기 때문이다. 그래서 코드를 한글 계산기로 수정해주어야 한다. 에러 코드 마지막에 보면 

 

51번째 줄 에러

51번째 줄 에러가 나오는데 그 줄이 바로 계산기의 지우기 버튼 부분이다.

 

에러가 발생한 지점

이게 영문 윈도우 계산기에서는 요소가 "Clear"로 표시되는건데 한글 윈도우에서는 다르게 나온다. 이를 확인하기 위해 C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x86\UIAVerify  이 경로에서 VisualUIAVerifyNative.exe 를 실행해준다.

 

왼쪽 목록에서 계산기를 찾아 트리를 열어보면 해당 요소에 포커싱이 된다. 

 

지우기 버튼의 한글 요소명은 "지우기"

 

저 C버튼의 요소명이 영문은 "Clear"로 되어있는거였고 한글은 보다시피 "지우기"로 되어있다. 코드를 지우기로 바꿔준다.

 

지우기로 변경

 

다시 실행해보면 이제 51번째에서 에러가 발생하지 않는다. 이제 다음 코드에서 또 에러가 발생하는데

 

계산결과 출력부분 에러

이것도 같은 원인이다. 기대값과 실제값이 달라서 나오는 에러이다. 결과값 표시하는 부분의 요소를 확인해본다.

 

결과표시 부분의 요소가 "표시는 0"이라고 되어있다.

 

코드에서 결과값을 파싱하는 함수를 확인해보면

 

"Display is" 라고 되어있다.

 

이 함수는 결과값을 파싱해서 "Display is"를 잘라내는 기능을 가지고 있다. "Display is" 를 "표시는" 으로 수정해준다.

즉 이 함수는 "표시는 0" 결과값을 표시는은 잘라내어서 "0"만 출력해주는 함수로 Assert.assertEquals("0", _GetCalculatorResultText()); 이 코드의 Assert 기대 값과 일치하게 된다. 다시 실행해보면 에러가 해결되고 다음 에러가 또 발생한다.

 

 

이것 또한 역시 요소를 찾을 수 없다는 에러이다. 요소를 확인해보면

 

"One"은 "1" 되어있다

 

 

그래서 일단 숫자는 모두 아라비아 숫자로 수정해주면 되고 연산자 또한 한글에 맞게 수정해주어야 한다.

 

연산자는 요소명이 "곱하기" 로 되어있다.

 

숫자와 연산자를 모두 수정한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package winappdriver;
 
 
import org.junit.*;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.concurrent.TimeUnit;
import java.net.URL;
import io.appium.java_client.windows.WindowsDriver;
 
public class CalculatorTest {
 
    private static WindowsDriver CalculatorSession = null;
    private static WebElement CalculatorResult = null;
 
    @BeforeClass
    public static void setup() {
        try {
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setCapability("app""Microsoft.WindowsCalculator_8wekyb3d8bbwe!App");
            CalculatorSession = new WindowsDriver(new URL("http://127.0.0.1:4723"), capabilities);
            CalculatorSession.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
 
            CalculatorResult = CalculatorSession.findElementByAccessibilityId("CalculatorResults");
            Assert.assertNotNull(CalculatorResult);
 
        }catch(Exception e){
            e.printStackTrace();
        } finally {
        }
    }
 
    @Before
    public void Clear()
    {
        CalculatorSession.findElementByName("지우기").click();
        Assert.assertEquals("0", _GetCalculatorResultText());
    }
 
    @AfterClass
    public static void TearDown()
    {
        CalculatorResult = null;
        if (CalculatorSession != null) {
            CalculatorSession.quit();
        }
        CalculatorSession = null;
    }
 
    @Test
    public void Addition()
    {
        CalculatorSession.findElementByName("1").click();
        CalculatorSession.findElementByName("더하기").click();
        CalculatorSession.findElementByName("7").click();
        CalculatorSession.findElementByName("같음").click();
        Assert.assertEquals("8", _GetCalculatorResultText());
    }
 
    @Test
    public void Combination()
    {
        CalculatorSession.findElementByName("7").click();
        CalculatorSession.findElementByName("곱하기").click();
        CalculatorSession.findElementByName("9").click();
        CalculatorSession.findElementByName("더하기").click();
        CalculatorSession.findElementByName("1").click();
        CalculatorSession.findElementByName("같음").click();
        CalculatorSession.findElementByName("나누기").click();
        CalculatorSession.findElementByName("8").click();
        CalculatorSession.findElementByName("같음").click();
        Assert.assertEquals("8", _GetCalculatorResultText());
    }
 
    @Test
    public void Division()
    {
        CalculatorSession.findElementByName("8").click();
        CalculatorSession.findElementByName("8").click();
        CalculatorSession.findElementByName("나누기").click();
        CalculatorSession.findElementByName("1").click();
        CalculatorSession.findElementByName("1").click();
        CalculatorSession.findElementByName("같음").click();
        Assert.assertEquals("8", _GetCalculatorResultText());
    }
 
    @Test
    public void Multiplication()
    {
        CalculatorSession.findElementByName("9").click();
        CalculatorSession.findElementByName("곱하기").click();
        CalculatorSession.findElementByName("9").click();
        CalculatorSession.findElementByName("같음").click();
        Assert.assertEquals("81", _GetCalculatorResultText());
    }
 
    @Test
    public void Subtraction()
    {
        CalculatorSession.findElementByName("9").click();
        CalculatorSession.findElementByName("빼기").click();
        CalculatorSession.findElementByName("1").click();
        CalculatorSession.findElementByName("같음").click();
        Assert.assertEquals("8", _GetCalculatorResultText());
    }
 
    protected String _GetCalculatorResultText()
    {
        // trim extra text and whitespace off of the display value
        return CalculatorResult.getText().replace("표시는""").trim();
    }
 
}
 
cs

 

테스트 수행 영상

 

https://youtu.be/gyNe-ABwDkM

 

다음은 Maven 프로젝트에서 실행하기

Maven 프로젝트는 라이브러리를 다운받아 프로젝트에 추가할 필요 없이 pom.xml에서 Maven repository 설정만 해주면 실행이 가능하다.

 

File > New > Other 진입 후 Maven Project 선택

 

쭉 >> 진행

 

별다른 설정은 건드리지 않고 생성하였다. 위에 있는 코드 중 패키지 코드를 제외한 코드를 복사해서 AppTest.java에 붙여넣기 한다.

 

그럼 에러가 쫙 뜨는데 이건 Maven repository 설정을 해주어야 한다.

 

에러 투성이

 

예제 샘플 폴더에서 WinAppDriver-1.1\Samples\Java\CalculatorTest 경로로 이동하여 pom.xml 파일을 프로젝트에 덮어씌운다.

 

pom.xml 파일을 복사한다

 

아니면 아래 코드를 pom.xml에 붙여넣기 한다

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>CalculatorTest</groupId>
    <artifactId>CalculatorTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>5.0.0-BETA6</version>
        </dependency>
    </dependencies>

</project>

 

붙여넣기 하고나면 에러가 모두 사라졌을 것이다. 클래스명 에러만 남았을 텐데 이건 파일명과 똑같이 맞춰주면 해결된다. 그리고 JUnit Test Run을 실행하면 계산기 자동화 테스트가 수행된다.

 

 

 

 

 

 




자동화를 하면 항상 새 크롬창을 띄웠는데 현재 실행 중인 크롬 창에서 실행할 수는 없을까해서 검색해본 결과


무조건 한번은 새로 크롬을 새로 띄워야 한다는 결론에 도달.


그리고 그 크롬에서 적용 할 수 있었다.


첫번째 해야할 것은 (크롬드라이버 다운은 필수)


cmd에서 디버그용? 크롬을 실행시켜야 한다


chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile" 


이걸 cmd에서 실행해보면 크롬이 실행된다.


안된다면 C:\Program Files (x86)\Google\Chrome\Application\ 이 경로로 이동해서 실행해보거나


환경변수에 위 경로를 추가해준다.



이 크롬으로 계속 재활용할 수 있다.


이제 이걸 자바 코드 내에 cmd 실행을 시킨다음 실행해주면 된다.


참고로 코드 내에서 실행할 때는 완전한 경로로 해주어야 실행이 된다.


 Runtime.getRuntime().exec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/selenum/AutomationProfile\"");


위 코드를 먼저 실행해 준 다음


ChromeOptions options = new ChromeOptions();

options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");

driver = new ChromeDriver(options); 


크롬 옵션을 추가해주어 실행된 크롬창을 사용하도록 지정해준다.(9222포트는 위 실행명령어 포트와 동일)



전체적인 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Automation {
 
    private static WebDriver driver;
 
    @BeforeClass 
    public static void setUp() throws Exception { 
        System.setProperty("webdriver.chrome.driver""C:\\chromedriver.exe");
            
        Runtime.getRuntime().exec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/selenum/AutomationProfile\"");
 
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress""127.0.0.1:9222");
        driver = new ChromeDriver(options);
        
        System.out.println(driver.getTitle());
        driver.manage().window().maximize();
        driver.get("https://www.naver.com");
        
    }
}
cs



 자동화 실행 후 현재 실행중인 크롬에서 확인해보려면  Runtime.getRuntime().exec 코드를 주석처리하고 실행하면 확인해볼 수 있다


주석처리를 안하면 실행할 때마다 새로운 크롬이 생성된다.







셀레니움으로 자동화를 하다보면 작업관리자에 chromedriver.exe가 수두룩하게 누적되어 있는 걸 볼 수 있다


이게 쌓이다보면 메모리를 상당히 잡아먹고 있는데 그래서 자동화가 한번 끝나면 프로세스를 종료하도록 하였다.

셀레니움에서 프로레스를 죽이는 기능이 있다고 하는데 이제 사용하지 않는 기능이라고 문서에 나와있었다




그렇다면 다른 방법으로 메소드를 다시 만들었을 것 같은데 아직 찾지 못했고 일단 급한대로 프로세스 죽이는 코드를 적용했다.



python 파이썬

- cmd에서 pip install psutil 로 설치 필수
1
2
3
4
5
6
7
import psutil 
 
for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
 
cs



java 자바에서 사용


1
Runtime.getRuntime().exec("taskkill /F /IM chromedriver.exe /T");
cs



자동화 코드 이후에 추가해주면 chromedriver.exe가 없어지는 걸 볼 수 있었다.




Naver Open API가 방식이 바뀌어서 이전 글에서 했던 방식은 동작이 되지않는다.

하지만 사전 준비는 동일하니 아래 글을 참고하면 된다.


REST-Assured 를 사용하여 maven 프로젝트로 간단한 API 테스트

http://yonoo88.tistory.com/886


우선 네이버오픈API 페이지에 들어간다.

https://developers.naver.com/main/

들어가서 상단 Application > 애플리케이션 등록을 들어간다.


애플리케이션 이름적고 사용할 API 추가하고 환경은 저렇게 해주어도 된다.



등록하기를 누르면 아래와 같은 화면이 나오는데 

Client ID 와 Client Secret 저 2개가 필요하다.

Client Secret는 우측 보기를 누르면 표시된다.

이 2개를 복사해서 코드에 넣어주어야 한다.

저 2개 값을 header 값으로 추가해주어야 한다.

String 값으로 Client ID,와 Client Secret 에 개인 값을 넣어준다.

그럼 api가 정상적으로 동작한다.



예제코드 뉴스 검색 API 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package NaverAPITest.NAPITest;
 
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
 
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
 
import org.junit.Before;
import org.junit.Test;
 
public class test {
 
    @Before
    public void apiTest() {
         baseURI = "http://openapi.naver.com";
//        baseURI = "http://maps.googleapis.com";
        port = 80;
    }
 
    @Test
    public void test() {
        try {
            String text = URLEncoder.encode("최순실""UTF-8");
            given().
              header("X-Naver-Client-Id""Client ID").
              header("X-Naver-Client-Secret","Client Secret").
             params( //URL 주소의 파라미터 값을 넣어줌
             "query",text     
             ).when().
            
             /*baseURL 을 제외한 뒷부분 주소를 get하고
             *body에서 해당 title 내용을 가져올 위치 지정 후
             *확인할 값을 equalTo에 넣어 확인*/
             get("/v1/search/news.xml").then().body("rss.channel.title", equalTo("Naver Open API - news ::'최순실'"));
//             get("/v1/search/news.xml").then().toString();
            
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
 
}
 
cs







버거킹 영수증을 받아보면 하단에 설문조사코드가 있습니다.


설문을 마치면 단품으로 세트를 먹을 수 있는 코드를 발급받게 되는데요


설문조사를 하는 것도 은근히 시간이 걸리는 것 같아 한번 시도해보았습니다.


Selenium 을 사용하였고 스윙으로 UI를 대충 만들어보았습니다.


설문이 끝나면 발급코드가 표시되는 간단한 프로그램입니다.


자바 환경 설치가 필수로 되어 있어야 하며


C: 또는 D: 드라이브 경로에 

chromedriver.exe가 존재해야 합니다.


chromedriver.exe






시연 영상



http://youtu.be/NtjBOtUwknM



셀레니움 부분 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.burger.king;
 
import java.io.File;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
 
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.Condition.*;
 
@FixMethodOrder (MethodSorters.NAME_ASCENDING)
 
public class survey {
    private static WebDriver driver;
    
    static String receiptNum="";
    static String url="https://kor.tellburgerking.com";
    
    
    public void inputNumber(String number){
          // 텍스트 필드값 가져오기
        receiptNum = number;
    }
 
 
    @BeforeClass
    public static void setUp() throws Exception {
        
        File file = new File("c:/chromedriver.exe");
        File file2 = new File("d:/chromedriver.exe");
           if(file.isFile()){         
               System.setProperty("webdriver.chrome.driver""c:/chromedriver.exe"); //크롬 드라이버 파일 경로설정
        }else if(file2.isFile()){
            System.setProperty("webdriver.chrome.driver""d:/chromedriver.exe"); //크롬 드라이버 파일 경로설정    
        }else{
            //안내문
            runner.labelIntroduce.setText("C 또는 D드라이브에 chromedriver가 없습니다.\n");
        }
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //응답시간 5초설정
        driver.get(url); 
        
         driver.manage().window().maximize();
    }
    
    public static void login() throws InterruptedException   {
        boolean boo = true;
        WebElement NextButton = driver.findElement(By.id("NextButton"));
        NextButton.click();   
        
        driver.findElement(By.id("CN1")).sendKeys(receiptNum);  //ID
        Thread.sleep(1000);
        driver.findElement(By.id("NextButton")).click();
        
        
        int i = 0;
        while(boo){
            try{
                
                boolean radioButtonHolder = driver.findElements(By.className("radioButtonHolder")).size() > 0;
                boolean checkboxBranded = driver.findElements(By.className("checkboxBranded")).size() > 0;
                boolean radioBranded = driver.findElements(By.className("radioBranded")).size() > 0;
                boolean checkCode = driver.findElements(By.className("ValCode")).size() > 0;
                boolean Next = driver.findElements(By.id("NextButton")).size() > 0;
                 if(radioButtonHolder){
                     driver.findElement(By.className("radioButtonHolder")).click();
                 }
                 else if(checkboxBranded){
                     driver.findElement(By.className("checkboxBranded")).click();
                 }
                 else if(radioBranded){
                     driver.findElement(By.className("radioBranded")).click();
                 }
                 if(Next)
                     driver.findElement(By.id("NextButton")).click();
                 if(checkCode)
                     boo = false;
                 System.out.println(i++);
            }catch (NoSuchElementException e){
                
            }
           
        }
        
        String checkCode = driver.findElement(By.xpath("//*[@id='FNSfinishText']/div/p[2]")).getText();
 
        runner.labelIntroduce.setText(checkCode);
    }
    
 
    @Test
    public static void run() throws Exception {
        login();
        Thread.sleep(500);
    }
 
    @AfterClass
    public static void tearDown() throws Exception {
        driver.quit();
    }
 
}
cs



스윙UI 부분


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.burger.king;
 
import javax.swing.*;
 
import com.burger.king.runner;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
 
class runner extends Thread{
    Simulator simul = new Simulator();
    public static    JLabel labelIntroduce;
    public static survey survey = new survey();
    public  static  JTextField tf_receiptNum;
    public static JLabel submit,number;
    public boolean check = true
    public void run(){
        // 텍스트 필드값 가져오기
        String receiptNum = tf_receiptNum.getText();
        try {
            survey.setUp();
        } catch (Exception e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        survey.inputNumber(receiptNum);
        try {
            survey.run();
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    
}
 
class JPanel033 extends JPanel{        
    runner thread = new runner();
    
    // 클래스 멤버 필드 설정
    private    JLabel name;
    private    JLabel id;
            
    
    private    JButton buttonSave;
    private    JButton buttonStop;
    public boolean check = true
    
    public JPanel033() {         
        
        setLayout(null);
        
        // 라벨
        name = new JLabel("by. yonoo");
        name.setSize(10020);   
        name.setLocation(20);
        
        id = new JLabel("설문조사코드: ");
        id.setBounds(10,30,100,20);
        
        // 텍스트 필드
        runner.tf_receiptNum = new JTextField();             
        runner.tf_receiptNum.setBounds(100,30,200,20);
        
        thread.labelIntroduce = new JLabel("=");
        thread.labelIntroduce.setBounds(10,50,280,20);
       
            
        // 버튼        
        buttonSave = new JButton("시작");
        buttonSave.setBounds(80,80,100,20);
        buttonSave.addActionListener(new EventHandlerSave());   
        
        buttonStop = new JButton("정지");
        buttonStop.setBounds(220,80,100,20);
        buttonStop.addActionListener(new EventHandlerStop());   
        
        add(name);
        add(thread.labelIntroduce);
        
        add(id);
        add(thread.tf_receiptNum);
        
        add(buttonSave);
        add(buttonStop);
        
    }
    
    class EventHandlerSave implements ActionListener{     // 
        public void actionPerformed(ActionEvent e){
//            try {
//                thread.start();    
//            } catch (Exception e1) {
//                // TODO Auto-generated catch block
//                e1.printStackTrace();
//            }
            
            if(check){
                thread.start();    
            }else{
                runner thread = new runner();
                thread.start();    
                check = true;
            }
        }
    }   
    class EventHandlerStop implements ActionListener{     // 
        public void actionPerformed(ActionEvent e){
            check = false;
            System.out.println(check);
            thread.interrupt();
            System.out.println("정지!");
//            System.exit(1);
            
        }
    } 
    
}
 
 
public class Simulator extends JFrame{
    
    public JPanel033 jpanel03 = null;
   
    public static void main(String[] args) {
        Simulator win = new Simulator();
        
        win.setTitle("BurgerKing Survey Automation");
        win.jpanel03 = new JPanel033();
        
        URL imageURL = Simulator.class.getClassLoader().getResource("burger.png");
        System.out.println(imageURL);
        ImageIcon img = new ImageIcon(imageURL);
        win.setIconImage(img.getImage());
        
        win.add(win.jpanel03);
 
        win.setSize(400,150);
        win.setVisible(true);
        win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        
        
    }
    
}
 
cs





eclipse 에서 maven 프로젝트를 새로 생성한다.







create a simple.. 체크해주었다





이름을 짓고 피니쉬







src/test/java 에 새 패키지를 추가했다.





이런 식으로..






거기에 Junit Test Case 를 생성한다.










그리고 maven 프로젝트의 pom.xml에 다음과 같은 내용을 추가해준다.


https://github.com/rest-assured/rest-assured/wiki/GettingStarted


위 링크로 가면 자세히 나와있다.

우선 그냥 


REST Assured

JsonPath

XmlPath

JSON Schema Validation


4가지를 추가해줬다.






4가지 추가된 모습









예제로 네이버 open api 에서 해보았다.


http://developer.naver.com/wiki/pages/SrchBook


위 링크에 들어가면 예시 URL과 함께 파라미터 값도 나와있다


1. 요청 URL (request url)#

http://openapi.naver.com/search

2. 요청 변수 (request parameter)#

2.1 기본검색#

요청 변수설명
keystring (필수)이용 등록을 통해 받은 key 스트링을 입력합니다.
targetstring (필수) : book서비스를 위해서는 무조건 지정해야 합니다.
querystring (필수)검색을 원하는 질의, UTF-8 인코딩 입니다.
displayinteger : 기본값 10, 최대 100검색결과 출력건수를 지정합니다. 최대 100 까지 가능합니다.
startinteger : 기본값 1, 최대 1000검색의 시작위치를 지정할 수 있습니다. 최대 1000 까지 가능합니다.
  • 샘플 URL ('삼국지'를 검색할 경우)

http://openapi.naver.com/search?key=c1b406b32dbbbbeee5f2a36ddc14067f&query=%EC%82%BC%EA%B5%AD%EC%A7%80&display=10&start=1&target=book



위 링크의 예제 URL로 들어가보면


http://openapi.naver.com/search?key=c1b406b32dbbbbeee5f2a36ddc14067f&query=삼국지&display=10&start=1&target=book



아래와 같은 페이지가 노출되는데

여기 xml값 중 title 내용으로 확인을 해보았다.









아래와 같이 끄적끄적 한 뒤


given().when() 이런 것들은 아직 잘 모름

예시대로 해본 것 뿐 





예시코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package rest.test.api.com;
 
import static org.junit.Assert.fail;
 
import org.junit.Before;
 
import static io.restassured.RestAssured.*;
import static io.restassured.matcher.RestAssuredMatchers.*;
import static org.hamcrest.Matchers.*;
import static io.restassured.module.jsv.JsonSchemaValidator.*;
 
import org.junit.Test;
 
public class APITest {
 
    public APITest() {
        baseURI = "http://openapi.naver.com";
        port = 80;
    }
 
    @Test
    public void test() {
        given().
                params( //URL 주소의 파라미터 값을 넣어줌
                "key","c1b406b32dbbbbeee5f2a36ddc14067f",
                "query","삼국지",
                "display","10",
                "start","1",
                "target""book"
                ).when().
                
                /*baseURL 을 제외한 뒷부분 주소를 get하고
                 *body에서 해당 title 내용을 가져올 위치 지정 후
                 *확인할 값을 equalTo에 넣어 확인*/
        get("/search").then().body("rss.channel.title", equalTo("Naver Open API - book ::'sample'"));
    }
 
}
 
cs



body에서 rss.channel.title 인 이유는 페이지에 보면 
rss
ㄴchannel
  ㄴtitle

이런 식으로 구성되어서 그렇다.



equalTo 는 title 을 적어주어 URL을 호출했을 때 equalTo 값과 일치하는지 확인하는 부분이다.



값이 일치한다면 아래처럼 정상적으로 테스트가 초록색으로 끝난다.










번역기를 재가공한 발 번역 주의...


출처 : http://www.softwaretestinghelp.com/mistakes-of-my-life-as-software-tester/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Softwaretestinghelp+%28softwaretestinghelp%29


4 Mistakes of My Life as a Software Tester (and You’re Probably Making These)


이 글은 필자가 소프트웨어 테스터로 지내오면서 느낀 4가지 실수를 공유하고 싶어하여 쓴 글입니다. (그리고 아마도 당신이 겪었을 수도 있는..)

 

많은 사람들은 개구리들이 세상 밖으로 나와 어떻게 세계가 이렇게 크고 아름다고 다른지 깨달은 우물 안 개구리 이야기를 알고 있습니다.

당신이 일하고 있는 삶에서 이러한 이야기의 어떤 점에 대해서 생각해보았나요? 현실세계에 온 걸 환영해요

오늘 제가 소프트웨어 테스팅 커리어를 시작하고 나서 겪었던 4가지 실수를 공유하려고 합니다.

 

테스터가 하게되는 흔한 4가지 실수

당신의 커리어에서 다음 사례에 대해 얼마나 많은 생각을 해보았습니까?

 

#1.질문은 항상 필요하지 않다.


우리 모두는 약점을 가지고 있습니다. 인기있는 조사에 따르면 성인들이 가지는 대부분의 약점들은 바보처럼 보이는 것에 대한 두려움입니다. 비현실적인 두려움은 우리의 성장을 막습니다. 가정하면 질문하는 것은 우리가 어떤 것을 배우는 것입니다.


온라인 티켓 예약 어플리케이션을 테스팅 하는 동안 테스터는 사용자가 예약한지 최소 24시간이 지난 티켓은 취소할 수 없다는 것을 발견했었습니다. 지금은 마지막 사용자의 관점에서 이것은 받아들일 수 없는 것입니다. 질문 대신에 행동으로 테스터는 그것이 요구될 수 있는 것으로 가정했었습니다. 이러한 잘못된 가정은 어플리케이션이 시장에서 실패하도록 만들었습니다.


그의 질문 스타일을 잘 알고 있는 한 테스터 친구는 버그가 어떻게 해결되었는지 물어보기 위해 버그 추적 시스템에서 로직을 코딩에 이르기까지 모든 것에 대해 질문하는 것을 보고 그가 웃었다고 말했었지만 그것은 그에게 유익했었어요. 왜냐하면 그는 어떤 것에 대해 명확하고 자신감있게 개발하고 있었기 때문이죠


질문을 주저하지 말고, 당신의 의견을 제시하세요. 테스터로서 당신은 어플리케이션의 동작과 실시간 사용량 데이터에 대한 질문할 모든 권한을 가지고 있습니다.

 

# 2. 자동화를 배우는 것은 어렵고 많은 시간이 소요됩니다.


"자동화" 아직까지도 많은 테스터들에게는 힘든 단어입니다.

아직도 많은 사람들은 이렇게 생각할까요?


자동화를 배우는 것은 시간이 걸릴 수 있습니다

자동화 배우는 것은 어렵습니다

자동화는 의미가 없습니다


현실적이지 않은 변화의 두려움, 새로운 것을 배우는 것에 대한 두려움, 당신의 안주하고 있는 곳에서 벗어나는 것에 대한 두려움, 이것은 아무 것도 아닙니다.

난 당신이 이 까다로운 분야에서 커리어를 쌓고 빠르게 성장하고 싶다면 자동화를 계속 배워나가라고 해주고 싶습니다.


# 3. 문서화 된 테스트 시나리오는 모든 것이 포함되어 있으며, 내가 그 이상을 생각할 필요는 없습니다.


지금까지 트렌드는 요구사항 탐색, 브레인 스토밍, 테스트 시나리오 문서, 기능적인 이해들을 검토하기 위해 보냅니다. 리뷰가 완료되면 테스트 담당자는 테스트 시나리오 문서를 따릅니다. 실시간 탐색적 테스트는 브레인 스토밍이 문서에서 이미 수행되어 필요없는 것으로 생각됩니다.

이것은 완전히 잘못된 접근입니다. 


예를 들면

당신은 그림을 10,30,60 분 동안 계속보고 있습니다. 첫째로, 당신은 그림에서 좋은 점을 찾았지만, 그림에 장시간 노출되어 당신은 결함을 깨닫기 시작합니다. 60 분 동안 그림을 응시 한 후, 당신은 오랫동안 그림을 그리고 그림에 대해 확실히 모든 결함을 알고 있는 것처럼 느낍니다. 그렇게 하루를 보냅니다.


다음 날 다시 그림을보세요. 당신은 어제 구석에서 혼합된 색상을 알아챘습니까? 괜찮아 보였나요? 당신은 잘못된 색상의 혼합물은 실제로 그림의 전체적인 효과를 망치고 있다고 생각하지 않나요? 당신은 어제 그것을 알아차리지 못해서 놀랬습니까? 일상은 우리에게 새로운 시각과 새로운 뷰를 가져다 주고 이로 인해 우리는 그것들은 다르게 보게 됩니다.


저는 테스트 하는 동안 테스트 케이스 문서에 의지하지 않고 본인의 관점을 명확하게 하길 바랍니다.

어플리케이션의 동작을 기록하고 자발적으로 어떤 것을 해보려 노력하세요

 

# 4. 나는 패턴 분석을 하지 않고 버그를 찾기 위해 여기에 있습니다


우리는 언제나 우리의 비지니스는 버그를 찾는 것이라고 확신했고 우리의 마인드라고 가르쳤습니다. 그 외 어떤 것도 우리 책임 범위가 아닙니다.

내가 수년 동안 사용해왔던 좋은 예시로 오늘 날 사고를 바꿔봅시다.


새로 오픈을 하고 열심히 노력해봐도 고객이 없는 레스토랑이 있습니다. 그들은 상황을 분석하는 전문가로 불립니다. 분석가는 레스토랑이 다양하고 분위기,가격 등을 갖췄음에도 단골이 없다는 것을 보았습니다. 그는 한번 다녀간 고객들과 연락하여 그들의 피드백을 받은 결과 그는 고객들이 다양한 음식의 맛을 좋아하지 않는 다는 것을 알았습니다. 즉시 새 요리사와 경험있는 요리사를 고용하자 레스토랑은 지금 줄 서있는 고객들을 볼 수 있습니다.


테스터로서 우리의 역할은 위의 상황에서 분석가와 동일합니다. 우리는 무엇이 잘못되었는지를 지적 할 필요는 없지만, 우리는 어플리케이션에 있는 버그의 어떤 패턴이 있는지와 이런 버그 때문에 다른 부분에 영향을 미칠 수 있는지 분석할 필요가 있습니다.

경험이 있다면 당신은 단지 제한적인 테스팅보다 자세한 분석을 제공할 수 있을 것입니다.


결론:


항상 자신을 업데이트하고 계속 새로운 것과 요구되는 스킬들을 배우고 정보와 문제들,지식을 나누며, 언제나 더 좋은 품질을 요구하는데 할 수 있는 사람이 되는 것을 주저하지 마세요

+ Recent posts