지식메모

반응형




그냥 갑자기 엑셀을 쓰다가 텍스트 개수 셀 일이 생겼다 

일일이 셀 수도 없고 해서 찾아보니 countif 라는 함수를 사용하면 된다.


즉 =countif(셀범위,"텍스트") 이러면 텍스트 개수가 나타난다.

셀범위는 직접 타이핑 하지 않고 드래그해서도 선택이 가능하다

사용법은 아래 영상으로



그리고 타 시트에서 값을 가져올 일도 생겼는데

의외로 쉬웠다.

셀에 = 를 입력 후 다른 시트가서 셀 선택 후 엔터를 치면 바로 가져와졌다.

가져온 값으로 다양하게 써먹을 수 있었다

아래 영상을 참고



반응형
반응형




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


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


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


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

반응형
반응형




윈도우 8.1 순정 ISO 파일 다운로드하여 USB/DVD로 저장하기 

http://yonoo88.tistory.com/694


위 링크와 별 차이가 없습니다

차이가 있다면 윈도우 10을 내려받는 것 밖에 없습니다.


아래 사이트로 들어가서


https://www.microsoft.com/ko-kr/software-download/windows10



지금 도구 다운로드를 클릭하면

MediaCreationTool.exe 파일을 내려받게 됩니다.



그걸 실행한 다음..

동의한 후에





다른 PC용 설치 미디어만들기 선택






ISO 파일을 선택합니다.







자동 권장옵션대로 한 다음





다운로드가 시작되고..






해당 경로로 가면 iso파일이 다운로드 되어 있을 겁니다.




이제 이 iso 파일로 USB에 부팅디스크로 만드는 방법은


http://yonoo88.tistory.com/694


위 링크에서 확인 가능합니다.


윈도우10 무료 업그레이드가 이제 5일 밖에 안남았으니 그 이후를 미리 준비하는게 좋겠죠





반응형
반응형

자주 쓰게 되는 것만 정리


Ctrl + D : 라인복제 또는 선택블록 복제

Ctrl + Y : 라인삭제


소스코드 정렬

Ctrl + Alt + L


Import 정리

Ctrl + Alt + O


Surround With (if / else, try / catch 등 블록 자동생성)

Ctrl + Alt + T


선언된 곳 찾아가기

Ctrl + B 또는 Ctrl + Click(Mouse)


Ctrl + Delete : 단어 끝까지 삭제

Ctrl + Backspace : 단어 처음까지 삭제


소스 코드 줄 이동

Alt + Shift + Up : Move Line Up

Alt + Shift + Down : Move Line Down


메소드 이동

Alt + Up : Move Up

Alt + Down : Move Down


Ctrl + Alt + I : 자동 들여쓰기


Shift + F6 : 이름 바꾸기

Alt + Delete : 안전하게 삭제(지우기전에 사용된곳 확인 가능)


Alt + Up/Down : 이전/다음 함수 이동

Ctrl + ] / [ :  코드블럭 처음/끝 이동



shift + F9 : 디버그 실행
F9 : 다음 중단점까지 진행
F7 : 중단점의 메소드 속으로 들어가서 진행
shift + F8 : 메소드 속에 들어갔던 진행에서 메소드를 빠져나옴
F8 : 한줄씩 실행
Alt + F9 : 커서를 원하는 라인에 놓고 누르면, 커서가 있는 곳까지 실행
하지만 중간에 중단점이 있으면 중단점까지 실행
Ctrl + Alt + F9 : 커서가 있는 위치까지 실행, 중간에 중단점이 있어도 무시
Ctrl + Shift + F8 : 모든 중단점 위치 확인
Ctrl + F2 : 디버그모드 종료. 일반 실행 모드로 전환


그 밖에 참고

http://www.androidside.com/bbs/board.php?bo_table=B56&wr_id=26482

http://kkangeva.tistory.com/42

반응형
반응형





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 값과 일치하는지 확인하는 부분이다.



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










반응형
반응형







우선 현재 synergy는 10달러?를 결제해야 사용할 수 있습니다.



하지만 유료로 전환되기 전 무료버전으로 설치해볼 수 있는데 

아래 링크에서 받으시면 됩니다.


http://symless.com/download/free/



먼저 윈도우부터 설치하므로 윈도우 본인 환경에 맞는 비트로 내려받기 합니다.





받으신 뒤 설치는 그냥 쭉쭉 하면 되고


중간에 계정 입력이 나오면 그냥 


Not interseted 


체크 하고 넘어갑니다.










언어는 편한대로










서버와 클라이언트 설정이 있는데 전 윈도우를 많이 쓰니

윈도우를 서버로 하겠습니다.


그럼 나중에 리눅스는 클라이언트가 되겠죠.









암호를 넣는데 안넣고 하셔도 되고 넣고 하셔도 됩니다.

클라이언트가 서버 접속할 때 필요한 암호거든요






그럼 설정이 다 끝나고 다음 화면에서 


Configure Server를 클릭합니다.







그럼 아래화면이 나오는데 우측 상단 모니터를 끌어다가 편한 위치에 드래그 합니다.


전 왼쪽엔 리눅스 컴, 오른쪽엔 윈도우 컴을 두고 쓰는터라 왼쪽에 드래그 했어요

그래야 작업할 때 편하겠죠


그리고 클라이언트 모니터를 더블클릭해줍니다.








스크린 네임에 클라이언트 컴퓨터 이름을 적어주어야 합니다.


이름 확인하는 법은 리눅스 설치할 때 설명하겠습니다.








그럼 서버설정은 다 됐습니다.


이제 리눅스에 설치하러 ㄱㄱ




전 리눅스 계열이긴 한데 Cent OS 였어요


그래서 레드햇 페도라 리눅스 64비트로 다운 받았어요



synergy-1.4.18-r2250-Linux-x86_64.rpm










리눅스 비트랑 컴퓨터 이름확인하는 법은

계정 클릭 > 설정 클릭










장치이름이 컴퓨터 이름이고 

비트는 64비트로 나오네요







내려받기 하면 rpm 파일이 내려받아지는데 전 그냥 더블클릭해서 설치했어요.

막 커맨드 창가서 안해도 되더군요.


설치가 다 끝나면 커맨드 창으로 가서


synergy -a "servier_ip"


로 실행해줍니다.









그럼 윈도우와 같은 화면이 나오는데 리눅스는 클라이언트니 클라이언트에 체크해주시고

서버 아이피는 윈도우 깔린 피시의 ip를 적어주면 됩니다.



그리고 위 메뉴에서 Edit를 클릭

settings에 들어갑니다.





그럼 여기서 스크린네임에 클라이언트 컴퓨터 이름을 적어줍니다.


서버 암호가 설정되어있다면 Encryption에 Enable 체크 후 암호를 넣어줍니다.





ok로 설정 마친 후 스타트를 누르면 모든게 끝났습니다.


윈도우 컴에서 마우스를 리눅스 화면으로 끌어보세요


키보드 마우스 하나로 리눅스 컴터도 제어 할 수 있습니다.


물론 인터넷이 끊기거나 한쪽의 synergy가  종료되면 안되겠죠.


키보드 마우스 2개 놓고 작업하지 않아도 되서 편합니다.





반응형
반응형

진짜 이상한 걸로 스트레스 주는 사이트들은 반성해야함


xbox 앱 로그인이 안되는데 0x8015dc0c 이런 에러코드가 발생한다.


고객지원가서 에러코드 검색해도 나오지도 않는다. 뭐 이따구인지..


보니까 이 문제 겪는 사람이 꽤 많다 근데도 에러코드 설명을 추가하지 않는 건 무슨 똥고집인지


아무튼 이 에러코드의 원인은 나이 인증을 하지 않아서이다.


Xbox 홈페이지에 들어가 로그인 한 후 오른쪽 상단에 자신의 로그인 된 계정을 눌러준다.


그 메뉴에서 프로필을 눌러준다.




그럼 confirm age 라는 페이지가 나오는데 클릭한다.


그럼 아이핀 인증 창이 나온다.


인증완료 하면 이제 로그인이 된다.


마이크로소프트는 이 에러코드를 빨리 반영해놓길.



반응형
반응형

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


출처 : 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