[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 2์ฐจ ์Šคํ„ฐ๋””] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  (4/18~5/5)

2025. 5. 5. 19:46ยท๐Ÿ“‚ Quality Assurance Study/๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™

๐Ÿ“Œ ์Šคํ„ฐ๋”” ๋ชฉํ‘œ

1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ, ๋งค๋‹ˆ์ €๋‹˜๊ณผ 1๋Œ€1 ๋ฉด๋‹ด์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ์ฃผ์–ด์กŒ๋‹ค. ๊ทธ ์ž๋ฆฌ์—์„œ ๋งค๋‹ˆ์ €๋‹˜๊ป˜์„œ๋Š” 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ์—ญ์‹œ ์›น ์ž๋™ํ™”๋กœ ์ง„ํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ๋ง์”€ํ•˜์…จ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ„๋ช… ๋ถ€ํŠธ์บ ํ”„ ์ดˆ๋ฐ˜ ์ปค๋ฆฌํ˜๋Ÿผ์—๋Š” Appium๋„ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ๊ณ , ๋‚˜ ์—ญ์‹œ ๊ทธ ์‹ค์Šต์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฝ”์น˜๋‹˜๊ป˜์„œ ๋ ˆ์ด์„œ๋“ค์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜์‹œ๋ฉฐ, Appium์€ ์‹ค์Šต ์—†์ด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์…จ๊ณ , ์ด ๊ณผ์ •์— ๋Œ€ํ•ด ์•„์‰ฌ์›€๊ณผ ๋ถˆ๋งŒ์ด ์ปธ๋‹ค.
 
๊ทธ๋ž˜์„œ ๋‚˜๋Š” 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ๋„ ์›น ์ž๋™ํ™”๋กœ ์ง„ํ–‰๋œ๋‹ค๋ฉด, ๋ณ„๋„๋กœ Appium์„ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…์„ธ์„œ์™€ APK ํŒŒ์ผ์„ ์ œ๊ณตํ•ด๋‹ฌ๋ผ๊ณ  ๋งค๋‹ˆ์ €๋‹˜๊ป˜ ์š”์ฒญ๋“œ๋ ธ๋‹ค. ๋‹คํ–‰ํžˆ ๋งค๋‹ˆ์ €๋‹˜๊ป˜์„œ๋Š” ํ”์พŒํžˆ ์Šน๋‚™ํ•ด์ฃผ์…จ๊ณ , ์ดํ›„ 1์ฐจ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚œ ๋’ค ์‹ค์ œ๋กœ ์ž๋ฃŒ ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋ฐ›์•˜๋‹ค. ๋งˆ์นจ 2์ฐจ ์Šคํ„ฐ๋”” ๋ชจ์ง‘ ์‹œ๊ธฐ๋„ ๋‹ค๊ฐ€์˜ค๊ณ  ์žˆ์—ˆ๊ธฐ์—, ์ด ๊ธฐํšŒ๋ฅผ ํ™œ์šฉํ•ด Appium ํ•™์Šต์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ์Šคํ„ฐ๋””์™€ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ ์ง„ํ–‰ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ด๋ฒˆ ์Šคํ„ฐ๋””๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๋‹ค.
 
์‚ฌ์‹ค ์˜คํ”„๋ผ์ธ์œผ๋กœ 10์ผ๊ฐ„ ์ง„ํ–‰ํ–ˆ๋˜ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ก  ์ˆ˜์—…์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ’์ง€๊ณ  ์œ ์ตํ•œ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์ˆ˜์—… ์ดํ›„์— ์ง„ํ–‰๋˜๋Š” ๋งŒํผ, ๋งค์ผ ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋งŒ๋‚˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ, ์˜จ๋ผ์ธ์œผ๋กœ ์†Œํ†ตํ•˜๊ณ  ํ˜‘์—…ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๊ธ์ •์ ์œผ๋กœ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์ด ์Šคํ„ฐ๋””๋ฅผ ํ†ตํ•ด Appium์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋ชฉํ‘œ๋‹ค. ๋‹ค๋ฅธ ๋ ˆ์ด์„œ๋ถ„๋“ค๋„ Appium์„ ์ œ๋Œ€๋กœ ๋‹ค๋ค„๋ณด์ง€ ๋ชปํ•œ ์ฑ„ ๋„˜์–ด๊ฐ”๊ธฐ์—, ํ•จ๊ป˜ ๋ถ€๋”ชํžˆ๊ณ  ๋ฐฐ์šฐ๋ฉฐ ์„ฑ์žฅํ•ด๋‚˜๊ฐ€๊ธธ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค.


๐Ÿ“Œ 4/17 - Appium ํŠน๊ฐ•

์–ด์ œ ์ง„ํ–‰๋œ ํŠน๊ฐ•์—์„œ๋Š” Appium ํ™˜๊ฒฝ ์„ธํŒ…๋ถ€ํ„ฐ Python์„ ํ™œ์šฉํ•œ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ๊นŒ์ง€ ์‹ค์Šต์„ ์ค‘์‹ฌ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค.
 
๐Ÿ› ๏ธ JDK, node.js, Android Studio ๋ฐ SDK ์„ค์น˜

๊ฐ€์žฅ ๋จผ์ € JDK์™€ node.js, ๊ทธ๋ฆฌ๊ณ  Android Studio ๋ฐ SDK ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•ด์•ผ ํ–ˆ๋‹ค.
์œ„์— ์ฒจ๋ถ€ํ•œ ์‚ฌ์ง„๋“ค์€ ์‹ค์Šต์„ ์œ„ํ•ด ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ SDK๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
 
๐Ÿ› ๏ธ Java์™€ Android ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

โœ… Java ์‹œ์Šคํ…œ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
๋ณ€์ˆ˜: JAVA_HOME
๊ฐ’: C:\Program Files\Java\jdk1.8

โœ… Java ์‹œ์Šคํ…œ ๋ณ€์ˆ˜ Path ์ถ”๊ฐ€
%JAVA_HOME%\bin  

โœ… Android ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
๋ณ€์ˆ˜: ANDROID_HOME
๊ฐ’: C:\Users\samsung\AppData\Local\Android\Sdk

โœ… Android ์‹œ์Šคํ…œ ๋ณ€์ˆ˜ Path ์ถ”๊ฐ€
%ANDROID_HOME%\platform-tools

 
๐Ÿ› ๏ธ appium ๋ฐ appium-doctor ์„ค์น˜

pip install -g appium
pip install -g appium-doctor

 โ€ข appium๊ณผ appium-doctor๋ฅผ ์„ค์น˜ํ•˜๊ณ , ํ„ฐ๋ฏธ๋„์— appium-doctor๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.
 โ€ข ์ดํ›„ Appium Inspector๋„ ์„ค์น˜ํ–ˆ๋Š”๋ฐ, ์ด๋Š” GitHub์˜ ๊ณต์‹ ๋ฆด๋ฆฌ์ฆˆ ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

### Diagnostic for necessary dependencies starting ###๋Š” Appium ์‹คํ–‰์— ํ•„์š”ํ•œ ํ•„์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์ ๊ฒ€ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.
์ด ํ•ญ๋ชฉ๋“ค ์˜†์— ๋ชจ๋‘ โœ”๏ธ ํ‘œ์‹œ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค๋ฉด, Appium์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์ด ์ œ๋Œ€๋กœ ๊ฐ–์ถฐ์กŒ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ ์ƒํƒœ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
 
๐Ÿ Python ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

pip install Appium-Python-Client

 โ€ข ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ๋จผ์ € Appium-Python-Client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.
 โ€ข ์ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ๋งŒ Python ์ฝ”๋“œ์—์„œ appium ๊ด€๋ จ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
 
โฌ‡๏ธ Appium ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ๋ง›๋ณด๊ธฐ

๋”๋ณด๊ธฐ
from appium import webdriver
from appium.options.common.base import AppiumOptions
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

import unittest

class SimpleTest(unittest.TestCase):
    def setUp(self):
        options = AppiumOptions()
        options.load_capabilities ({
            "platformName": "Android",
            "appium:deviceName": "emulator-5554",
            "appium:automationName": "UiAutomator2"
        })

        self.driver = webdriver.Remote("http://127.0.0.1:4723", options=options)
        print("Appium Driver Created")

    def test_search_input(self):
        try:
            # ๊ฒ€์ƒ‰์ฐฝ์— ํ‚ค์›Œ๋“œ ์ž…๋ ฅ
            search_box_id = "com.android.chrome:id/search_box_text"
            wait = WebDriverWait(self.driver, 10)
            search_input = wait.until(EC.element_to_be_clickable((AppiumBy.ID, search_box_id)))
            search_input.send_keys("Test Input")

            url_bar_id = "com.android.chrome:id/url_bar"
            url_bar = wait.until(EC.element_to_be_clickable((AppiumBy.ID, url_bar_id)))
            actual_text = url_bar.text
            expected_text = "Test Input"
            
            self.assertEqual(actual_text, expected_text, "Assertion Failed")
            print("Assertion Passed")

            # ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํด๋ฆญ
            suggestion_xpath = f'//android.widget.TextView[@resource-id="com.android.chrome:id/line_1" and @text="{expected_text}"]'
            suggestion_element = wait.until(EC.element_to_be_clickable((AppiumBy.XPATH, suggestion_xpath)))
            suggestion_element.click()

            result_page_search_xpath = f'//android.widget.EditText[@text="{expected_text}"]'
            result_element = wait.until(EC.visibility_of_element_located((AppiumBy.XPATH, result_page_search_xpath)))
            self.assertTrue(result_element.is_displayed(), "Not Displayed")

            home_button_id = "com.android.chrome:id/home_button"
            home_button = wait.until(EC.element_to_be_clickable((AppiumBy.ID, home_button_id)))
            home_button.click()
            print("Test completed")
        except Exception as e:
            print(e)
            raise

    def tearDown(self):
        if self.driver:
            self.driver.quit()

 
๐Ÿ“ฑ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐ Inspector ์—ฐ๋™
ํ„ฐ๋ฏธ๋„์— appium ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Appium ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
 > ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ„ฐ๋ฏธ๋„์— ์‚ฌ์šฉ ์ค‘์ธ ํฌํŠธ ๋ฒˆํ˜ธ(์˜ˆ: 4723)๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
 > ์ด๋•Œ ์ถœ๋ ฅ๋˜๋Š” Port Number๋Š” Appium ์„ค์ •์— ํ•„์š”ํ•œ Remote Port์ด๋‹ค.
์ดํ›„ Android Studio์—์„œ Virtual Device(๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Start ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์‹คํ–‰์‹œ์ผฐ๋‹ค.
 > ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„์— adb devices ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
 > ์ด๋•Œ ์ถœ๋ ฅ๋˜๋Š” ๋””๋ฐ”์ด์Šค์˜ Serial Number๋Š” Appium ์„ค์ •์— ํ•„์š”ํ•œ deviceName์ด๋‹ค.
 
Appium Inspector์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •์„ ์ž…๋ ฅํ–ˆ๋‹ค

Remote Host: 127.0.0.1
Remote Port: ์•ž์„œ ํ™•์ธํ•œ ํฌํŠธ ๋ฒˆํ˜ธ(๊ธฐ๋ณธ๊ฐ’: 4723)
Remote Path: /
JSON Representation: {
    "platformName": "Android",
    "appium:deviceName": "emulator-5554",
    "appium:automationName": "UiAutomator2"
}

๊ทธ ๊ฒฐ๊ณผ, Virtual Device์™€ Appium Inspector๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉฐ ํ™”๋ฉด์ด ๋™๊ธฐํ™”๋˜์—ˆ๋‹ค.
 
โ“ ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?
๐Ÿ”น Appium ์„œ๋ฒ„ ์‹คํ–‰ (appium)
   > appium ๋ช…๋ น์–ด๋Š” Appium ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด๋‹ค.
   > ์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด Appium ์„œ๋ฒ„๊ฐ€ ์ง€์ •๋œ ํฌํŠธ(๊ธฐ๋ณธ: 4723)๋ฅผ ์—ด๊ณ , ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
   > ํ•˜์ง€๋งŒ ์ด ์‹œ์ ์—๋Š” ์•„์ง ๋””๋ฐ”์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ์„ธ์…˜์€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋‹จ์ˆœํžˆ โ€œ๋‚˜๋Š” ์ค€๋น„๋์–ด! ๋ช…๋ น ์ค˜!โ€ ์ƒํƒœ๋กœ ๋Œ€๊ธฐ ์ค‘์ด๋‹ค.
๐Ÿ”น ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ์˜ ์„ธ์…˜ ์ƒ์„ฑ
   > ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, ์ฝ”๋“œ ๋‚ด์— ์„ค์ •๋œ capabilities ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Appium ํด๋ผ์ด์–ธํŠธ๊ฐ€ Appium ์„œ๋ฒ„์— POST /session ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
   > Appium ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์•„ ๋””๋ฐ”์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , ๊ณ ์œ ํ•œ ์„ธ์…˜ ID๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
   > ์ดํ›„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ด ์„ธ์…˜์„ ํ†ตํ•ด ๋ช…๋ น์„ ๋””๋ฐ”์ด์Šค์— ์ „๋‹ฌํ•˜๊ณ , ๋””๋ฐ”์ด์Šค์—์„œ ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์‹œ Appium ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.
   > ์„ธ์…˜์€ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ, ๊ธฐ์กด ์„ธ์…˜์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ session ID๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
๐Ÿ”น Appium Inspector์˜ ์—ญํ• 
   > Appium Inspector๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋””๋ฐ”์ด์Šค์˜ UI ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฑฐ๋‚˜, ์š”์†Œ์˜ ์†์„ฑ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋‹ค.
   > Inspector ์—ญ์‹œ ์ž์ฒด์ ์œผ๋กœ POST /session ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉฐ, ์ด๋•Œ Appium ์„œ๋ฒ„๋Š” ๋ณ„๋„์˜ ์„ธ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค.
   > ๋”ฐ๋ผ์„œ Inspector์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ์„ธ์…˜์—์„œ ์ž‘๋™ํ•œ๋‹ค. 
   > ๋‹จ, Inspector์—์„œ ์ƒ์„ฑํ•œ ์„ธ์…˜ ID๋ฅผ ๋ณต์‚ฌํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ง์ ‘ ์ง€์ •ํ•˜๋ฉด ๊ฐ™์€ ์„ธ์…˜์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
โฌ‡๏ธ Appium ๊ฐœ๋…์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ 

[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 7์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (Python์„ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)

[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 7์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (Python์„ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)

isliife2.tistory.com


๐Ÿ“Œ 4/18 - 1์ผ์ฐจ ํšŒ๊ณ  (์ฒซ ํšŒ์˜ & apk ์—ฐ๋™ ์‚ฝ์งˆ)

์˜ค๋Š˜์€ ๋งค๋‹ˆ์ €๋‹˜๊ป˜์„œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ „์šฉ ๋””์Šค์ฝ”๋“œ ๋ฐฉ์„ ๊ฐœ์„คํ•ด์ฃผ์…จ๊ณ , ์Šคํ„ฐ๋””์›๋“ค๊ณผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์‚ฌํ•ญ๋“ค์„ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋…ผ์˜๋œ ๋‚ด์šฉ์€ ๋ชจ๋‘ Notion์— ์ •๋ฆฌํ•˜์—ฌ ๊ณต์œ ํ•˜๊ณ , ๊ฐ์ž ์ž‘์—… ๋‚ด์šฉ์„ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.
 
๐Ÿ” adb logcat์„ ํ™œ์šฉํ•œ ํฌ๋ž˜์‹œ ๋กœ๊ทธ ๋ถ„์„
์ œ๊ณต๋ฐ›์€ APK ํŒŒ์ผ์„ Android Studio์˜ ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค์— ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜์—ฌ ์„ค์น˜ํ•œ ๋’ค ์‹คํ–‰์„ ์‹œ๋„ํ–ˆ๋Š”๋ฐ, ์•ฑ์ด ์‹คํ–‰๋˜์ž๋งˆ์ž ์ž๊พธ ๊ฐ•์ œ ์ข…๋ฃŒ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
 
์•ฑ ํฌ๋ž˜์‹œ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ํ„ฐ๋ฏธ๋„์— adb logcat > crashlog.txt ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ ๋’ค, ๋ฌธ์ œ์˜ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  Ctrl + C๋ฅผ ๋ˆŒ๋Ÿฌ ๋กœ๊ทธ ์ˆ˜์ง‘์„ ์ค‘์ง€ํ–ˆ๋‹ค. ์ดํ›„ notepad crashlog.txt ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘๋œ ๋กœ๊ทธ๋ฅผ ๋ฉ”๋ชจ์žฅ์œผ๋กœ ์—ด์–ด ํฌ๋ž˜์‹œ ์›์ธ์„ ํŒŒ์•…ํ–ˆ๋‹ค.

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.example.travel_on_final/app_lib/libflutter.so" is for EM_AARCH64 (183) instead of EM_X86_64 (62)

crashlog.txt๋ฅผ ํ†ตํ•ด ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ, ์•ฑ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ–ˆ๋‹ค.
 
์ฆ‰, ํ•ด๋‹น Flutter ์•ฑ์€ ARM64 ์•„ํ‚คํ…์ฒ˜์—์„œ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ๋นŒ๋“œ๋˜์–ด ์žˆ์—ˆ๊ณ , ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” x86_64 ๊ธฐ๋ฐ˜์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•ต์‹ฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ libflutter.so๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•ด ์•ฑ์ด ์ฃฝ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.
 
๐Ÿ’ก ARM64 ๋Œ€์‘ ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค ์ƒ์„ฑ
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Android Virtual Device(AVD)๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค. System Image๋Š” 'Google Play ARM 64 v8a System Image'๋กœ ์„ค์ •ํ•˜์—ฌ, ARM64 ์•„ํ‚คํ…์ฒ˜์— ๋งž๋Š” ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒˆ๋กœ ๋งŒ๋“  ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ ค ํ•˜์ž, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ ์‹คํ–‰ ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค.

The emulator process for AVD Medium_Phone_2 has terminated.

๋ฌธ์ œ์˜ ์›์ธ์€ ๋‚ด ๋…ธํŠธ๋ถ์ด Intel ๊ธฐ๋ฐ˜ CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ARM ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€๋ฅผ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด์„  ํ•˜๋“œ์›จ์–ด ๊ฐ€์ƒํ™” ์ง€์›์ด ํ•„์š”ํ•˜๋ฉฐ, ์ด ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‚˜๋Š” ์•„์ดํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ, ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์‹ค๊ธฐ๊ธฐ ์„ค์น˜๋„ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด๋‹ค. ํ˜น์‹œ๋‚˜ ํ•ด์„œ AMD CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณธ๊ฐ€ ๋ฐ์Šคํฌํƒ‘์— ์›๊ฒฉ ์ ‘์†ํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์‹œ๋„ํ•ด๋ณด์•˜์ง€๋งŒ, ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰์€ ์—ฌ์ „ํžˆ ์‹คํŒจํ–ˆ๋‹ค.
 
์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ, Flutter ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ง์ ‘ ์„ค์น˜ํ•œ ๋’ค, x86_64 ๊ธฐ๋ฐ˜์œผ๋กœ ์•ฑ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•ด๋ณด๋ ค ์‹œ๋„ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋นŒ๋“œ ๊ณผ์ •์€ ์˜์™ธ๋กœ ๋ณต์žกํ–ˆ๊ณ , ์„ค์ • ์ถฉ๋Œ๊ณผ ์˜์กด์„ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉด์„œ ๋ฌด๋ ค 4์‹œ๊ฐ„ ์ด์ƒ์„ ์†Œ๋ชจํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฒฐ๊ตญ ์‹คํŒจ๋กœ ๋๋‚˜๊ณ  ๋ง์•˜๋‹ค.


๐Ÿ“Œ 4/19 - 2์ผ์ฐจ ํšŒ๊ณ (์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํŒจ -> ์‹ค๊ธฐ๊ธฐ ์ „ํ™˜ ๋ฐ APK ์„ค์น˜ ์™„๋ฃŒ)

๐ŸŒ€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ๋Š” ์—ฐ๋™ ์‹คํŒจโ€ฆ ๊ฒฐ๊ตญ ์‹ค๊ธฐ๊ธฐ ๊ตฌ๋งค
์˜ค๋Š˜์€ ์Šคํ„ฐ๋””์›๋ถ„์ด ๊ณต์œ ํ•ด์ฃผ์‹  Udemy Postman ๊ฐ•์˜๋ฅผ ํ†ตํ•ด Postman์„ ๋ณต์Šตํ•œ๋‹ค๊ณ  ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ฝ ์˜คํ›„ 7์‹œ์ฏค๋ถ€ํ„ฐ ๋‹ค์‹œ APK ์—ฐ๋™์„ ์‹œ๋„ํ–ˆ๋Š”๋ฐ, ์—ฌ์ „ํžˆ ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ณ„์† ์‹คํŒจ๊ฐ€ ๋ฐ˜๋ณต๋˜์ž, ํ™”๊ฐ€ ์น˜๋ฐ€์–ด ๊ฒฐ๊ตญ ์„ฑ์ˆ˜์—์„œ ๋‹น๊ทผ๋งˆ์ผ“์„ ํ†ตํ•ด '๊ฐค๋Ÿญ์‹œ ์™€์ด๋“œ4'๋ฅผ 4๋งŒ ์›์— ๊ตฌ๋งคํ–ˆ๋‹ค.
 
๐Ÿ“ฑ Android ์‹ค๊ธฐ๊ธฐ ํ™˜๊ฒฝ ์„ค์ •
๊ฐค๋Ÿญ์‹œ ์™€์ด๋“œ4 ๊ธฐ๊ธฐ๋ฅผ ์„ธํŒ…ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณค๋‹ค

1. ๊ฐœ๋ฐœ์ž ์˜ต์…˜ ํ™œ์„ฑํ™”
 : ์„ค์ • > ํœด๋Œ€์ „ํ™” ์ •๋ณด > ์†Œํ”„ํŠธ์›จ์–ด ์ •๋ณด > ๋นŒ๋“œ๋ฒˆํ˜ธ 7๋ฒˆ ์—ฐ์† ํ„ฐ์น˜
2. USB ๋””๋ฒ„๊น… On
 : ์„ค์ • > ๊ฐœ๋ฐœ์ž ์˜ต์…˜ > USB ๋””๋ฒ„๊น… ํ™œ์„ฑํ™”
3. PC์™€ USB-C๋กœ ์—ฐ๊ฒฐ
 : ํ„ฐ๋ฏธ๋„์— adb devices ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ, ๊ธฐ๊ธฐ์˜ Serial Number๊ฐ€ ๋œจ๋ฉด ์—ฐ๊ฒฐ ์™„๋ฃŒ

 
๐Ÿ› ๏ธ APK ํŒŒ์ผ ์ˆ˜๋™ ์„ค์น˜ ๋ฐ Appium ์—ฐ๋™

 
์ดํ›„ cmd ์ฐฝ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ง์ ‘ APK๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค

adb install {apk ๊ฒฝ๋กœ}

 
์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ๋’ค์—๋Š” ์ด์ „์— ์ •๋ฆฌํ–ˆ๋˜ ๋‚ด์šฉ, "๐Ÿ“Œ 4/17 - Appium ํŠน๊ฐ•"์˜ "๐Ÿ“ฑ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐ Inspector" ์—ฐ๋™ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์—ฌ ์‹ค๊ธฐ๊ธฐ์™€ Appium์„ ์—ฐ๋™ํ–ˆ๋‹ค. ์ด๋•Œ Inspector ์„ค์ •์˜ JSON Representation์—์„œ "appium:deviceName" ๊ฐ’์— adb devices ์‹œ ์ถœ๋ ฅ๋œ ๊ธฐ๊ธฐ์˜ Serial Number๋ฅผ ์ž…๋ ฅํ•ด์•ผ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.
 
๐Ÿ” ์ดˆ๊ธฐ ํ™”๋ฉด ํƒ์ƒ‰ โ€“ XPath ์œ„์ฃผ๊ฐ€ ๋  ๋“ฏ?
์•ฑ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์ž, ๋ฉ”์ธ ํ™”๋ฉด์˜ UI ์š”์†Œ๋“ค์„ ๋Œ€๋žต์ ์œผ๋กœ ํ›‘์–ด๋ดค๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์š”์†Œ๊ฐ€ resource-id๋‚˜ ๋ช…ํ™•ํ•œ ์†์„ฑ์ด ์—†์–ด ๋ณด์˜€๊ณ , ๊ฒฐ๊ตญ์—๋Š” XPath๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ๋А๋‚Œ์„ ๋ฐ›์•˜๋‹ค. ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์— ๊ฝค๋‚˜ ๊นŒ๋‹ค๋กœ์šด ์ž‘์—…์ด ์˜ˆ์ƒ๋œ๋‹ค.


๐Ÿ“Œ 4/20 - 3์ผ์ฐจ ํšŒ๊ณ  (์•ฑ ์ฃผ์š” ๊ธฐ๋Šฅ ํŒŒ์•…)

์˜ค๋Š˜์€ Jest๋ฅผ ๋ณต์Šตํ•œ๋‹ค๊ณ  ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ Appium ํ™˜๊ฒฝ ์„ธํŒ…์€ ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌ๋œ ์ƒํƒœ์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋Š˜์€ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์•ฑ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 
 
๐Ÿ—‚๏ธ ์ฐธ๊ณ  ์ž๋ฃŒ

  • README ํŒŒ์ผ
  • ์‹œ์—ฐ ์˜์ƒ

์œ„ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ๋Šฅ ํ๋ฆ„์„ ์ •๋ฆฌํ•ด๋ดค๊ณ , ๊ธฐํš์„œ๋‚˜ ์™€์ด์–ดํ”„๋ ˆ์ž„ ๋“ฑ ๋‹ค๋ฅธ ๋ฌธ์„œ ํŒŒ์ผ๋“ค์€ ๊ถŒํ•œ ๋งŒ๋ฃŒ๋‚˜ ํ‰๊ฐ€ํŒ ์ข…๋ฃŒ ๋“ฑ์˜ ์ด์œ ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์•˜๋‹ค. ์‚ฌ์‹ค ๋ฌธ์„œ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค ๋ณด๋‹ˆ, ๊ธฐ๋Šฅ์ด ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€, ์ด ๋™์ž‘์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€ ์˜ค๋ฅ˜์ธ ๊ฒƒ์ธ์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ๋Š” ์‹ค์ œ ์•ฑ์„ ์‹คํ–‰ํ•ด๋ณด๊ณ , ์ง์ ‘ ์กฐ์ž‘ํ•˜๋ฉฐ ์ฒด๊ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ๊ธฐํš ๋ฌธ์„œ ์—†์ด ๊ธฐ๋Šฅ์„ ํŒŒ์•…ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์‰ฝ์ง€๋งŒ์€ ์•Š์ง€๋งŒ, ์˜คํžˆ๋ ค ์œ ์ € ์ž…์žฅ์—์„œ ๊ธฐ๋Šฅ์„ ๋ฐ”๋ผ๋ณด๋Š” ์—ฐ์Šต์ด ๋œ๋‹ค๋Š” ์ ์—์„œ ๋‚˜๋ฆ„์˜ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋А๋‚€๋‹ค.


๐Ÿ“Œ 4/21 - 4์ผ์ฐจ ํšŒ๊ณ  (ํˆด ์„ ์ •๋ถ€ํ„ฐ ๊ธฐ๋Šฅ ๋ถ„๋‹ด๊นŒ์ง€ ์ดˆ๊ธฐ ์„ค๊ณ„ ์™„๋ฃŒ)

 
์˜ค๋Š˜์€ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์„ ์œ„ํ•œ ๊ธฐ์ดˆ ์„ค๊ณ„๋ฅผ ์™„๋ฃŒํ•œ ๋‚ ์ด์—ˆ๋‹ค. ๋‹ค๋งŒ, apk๊ฐ€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ์„ค์น˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ณต๊ธฐ๊ณ„๊ฐ€ ์—†๋Š” ํŒ€์›๋ถ„๋“ค ์ค‘ ์•ฝ 4๋ช… ์ •๋„๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ดํƒˆํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์•„์‰ฌ์šด ์ผ์ด์ง€๋งŒ, ๋””๋ฐ”์ด์Šค ์˜์กด๋„๊ฐ€ ๋†’์€ Appium ํŠน์„ฑ์ƒ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
 
๐Ÿ› ๏ธ ํ”„๋กœ์ ํŠธ ํ˜‘์—… ํˆด ๊ฒฐ์ •

  • TC/์‹œ๋‚˜๋ฆฌ์˜ค: Google Spreadsheet 
  • ํ˜‘์—… ์ฑ„๋„: Discord + ์Šคํ„ฐ๋”” ์˜จ๋ผ์ธ ๊ฐ•์˜์‹ค (Slack์€ ์ถ”ํ›„ ๋„์ž… ์—ฌ๋ถ€ ๊ฒฐ์ • ์˜ˆ์ •)
  • ์ด์Šˆ ๊ด€๋ฆฌ: Jira
  • ๋ฌธ์„œ ์ •๋ฆฌ: Confluence
  • ์ฝ”๋“œ ๊ด€๋ฆฌ: GitHub

 
๐Ÿ“„ ๊ธฐ๋Šฅ ๋ถ„๋‹ด ๋ฐ TC ์ž‘์„ฑ ๋ฐฉ์‹ ๊ฒฐ์ •

  • ์ฃผ๋ง ๋™์•ˆ ๊ฐ์ž ํŒŒ์•…ํ•œ ์•ฑ ๊ธฐ๋Šฅ ๋‚ด์šฉ์„ Confluence ๋ฌธ์„œ๋กœ ํ†ตํ•ฉ ์ •๋ฆฌํ–ˆ๋‹ค. (GPT์˜ ๋„์›€์„ ๋ฐ›์•˜๋‹ค.)
  • ์ดํ›„ ์‚ฌ๋‹ค๋ฆฌ ํƒ€๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ์„ ๋ถ„๋‹ดํ–ˆ๊ณ , ๋ณธ์ธ์€ ํ™ˆ ํƒญ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๊ฐ์ž ์ž์‹ ์ด ๋งก์€ ๊ธฐ๋Šฅ์„ ๊ธฐ์ค€์œผ๋กœ TC/์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
  • TC ์ž‘์„ฑ ๋ฐฉ์‹์€ ์ž๋™ํ™”๋ฅผ ์—ผ๋‘์— ๋‘๊ณ , ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘์‹ฌ์˜ ๊ตฌ์กฐ๋กœ ํ†ต์ผํ–ˆ๋‹ค.

 


๐Ÿ“Œ ๊ฐœ์ธ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…๋“ค

  • Notion์— ์ •๋ฆฌ๋˜์–ด ์žˆ๋˜ ์ดˆ๊ธฐ ๋ฌธ์„œ๋“ค์„ ์ „๋ถ€ Confluence๋กœ ์ด๊ด€
  • ํŒ€์›์ด ์ œ๊ณตํ•œ ํฌ๋งท์„ ๋ฐ”ํƒ•์œผ๋กœ Google Spreadsheet์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ธฐ๋ณธ ํ‹€ ๊ตฌ์„ฑ
  • ๋‹ค๋ฅธ ํŒ€์›๋“ค์„ ์œ„ํ•ด ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ์ „๋žต ์ •๋ฆฌ ๋ฌธ์„œ ์ž‘์„ฑ ๋ฐ ๊ณต์œ 

๐Ÿ“Œ 4/22 - 5์ผ์ฐจ ํšŒ๊ณ  (ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ ์™„๋ฃŒ)

 
์˜ค๋Š˜์€ ๊ฐ์ž ๋งก์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ์„ ์™„๋ฃŒํ•œ ๋‚ ์ด์—ˆ๋‹ค. ๋ณธ์ธ์€ ์•ฑ์„ ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณด๋ฉฐ ์‹ค์ œ ๋™์ž‘ ํ๋ฆ„์„ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•œ ๋’ค, ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
 

 
๐Ÿ’ฌ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”ผ๋“œ๋ฐฑ ์‹œ๊ฐ„

  • ์ž‘์„ฑํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋“ค์„ Google Spreadsheet์—์„œ ์„œ๋กœ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›์•˜๋‹ค.
  • ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๊ณ  ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๋Š”๋ฐ, ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ์…€ ์•ˆ์— ๊ฐ์ž ํ•œ ์ค„์”ฉ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๋ฐฉ์‹์ด ๋„ˆ๋ฌด ๊ท€์—ฝ๊ณ  ํ›ˆํ›ˆํ–ˆ๋‹ค.
  • ๋‹จ์ˆœํžˆ ์˜จ๋ผ์ธ ๋Œ“๊ธ€์ด ์•„๋‹Œ, ๊ฐ™์€ ํ™”๋ฉด์„ ๋ฐ”๋ผ๋ณด๋ฉฐ ์ง์ ‘ ๋ฌธ์„œ๋ฅผ ๊ณ ์ณ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์—์„œ ํ˜‘์—…์˜ ์ฆ๊ฑฐ์›€์„ ๋‹ค์‹œ๊ธˆ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ์€ ์™„๋ฃŒ! โœจ ์šฐ๋ฆฌ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ ๋’ค, ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค(TC)๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
 

๊ทธ๋ฆฌ๊ณ .. ์šฐ๋ฆฌ ํŒ€์›๋ถ„๋“ค ๋„ˆ๋ฌด ์ข‹์•„.. ํ›ˆํ›ˆํ•ด.. ๋‚˜ ์ด๋Ÿฐ ๊ฑฐ ์ข‹์•„ํ•˜๋„ค.. ๐Ÿฅฐ
๋‹ค๋“ค ์ •๋ง ์—ด์‹ฌํžˆ ํ•˜์‹ ๋‹ค. ๋„ˆ๋ฌด ์ข‹๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋” ์—ด์‹ฌํžˆ ํ•˜๊ฒŒ ๋œ๋‹ค.
์ˆ˜์—…์„ ๋“ฃ๊ณ , ๋ณต์Šต ๋ฐ ์ •๋ฆฌ๋„ ํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ๋ณ‘ํ–‰ํ•˜๋ ค๋‹ˆ, ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๊ฑธ ์ƒˆ์‚ผ ๋А๋ผ๋Š” ์š”์ฆ˜์ด๋‹ค.


๐Ÿ“Œ 4/23 - 6์ผ์ฐจ ํšŒ๊ณ  (ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ์‹œ์ž‘)

 

์ฒ˜์Œ์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” "TC ํ•˜๋‚˜๋‹น ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜"๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํŒ€ ๋‚ด์—์„œ ์ •ํ–ˆ์ง€๋งŒ, ๋‚ด๊ฐ€ ๋งก์€ TC๋“ค์€ ์‚ฌ์ „ ์กฐ๊ฑด๊ณผ ์ˆ˜ํ–‰ ๋‹จ๊ณ„๊ฐ€ ๋Œ€๋ถ€๋ถ„ ๋™์ผํ–ˆ๊ณ , ๋‹จ์ง€ ํด๋ฆญํ•ด์•ผ ํ•˜๋Š” ์ง€์—ญ ํ•„ํ„ฐ ์š”์†Œ๋งŒ ๋‹ค๋ฅผ ๋ฟ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” โ€œ์ด๊ฑด ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ฃผ๋ฉด ๋˜์ง€ ์•Š๋‚˜?โ€๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์˜คํžˆ๋ ค ๋น„ํšจ์œจ์ ์ด๋ผ ๋А๊ผˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 

ํ•˜์ง€๋งŒ ํŒ€์›๋“ค๊ณผ ๋…ผ์˜ํ•œ ๊ฒฐ๊ณผ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋ฅผ ํ™œ์šฉํ•˜๋”๋ผ๋„, TC ๋ฌธ์„œ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ๋งž๋‹ค๋Š” ์˜๊ฒฌ์ด ๋‚˜์™”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ ํƒํ•œ ํ•„ํ„ฐ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋กœ ๋‚˜์™€์•ผ ํ•˜๋Š” ์ง€์—ญ๋ช…์ด ๋‹ค๋ฅด๊ณ , ์ด ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ ์ž์ฒด๊ฐ€ TC๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ ๊ธฐ์ค€์—์„œ๋Š” ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ํƒ€๋‹นํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์•„์ง๊นŒ์ง€ ์ž๋™ํ™”๋ฅผ ๊ณ ๋ คํ•œ TC ์„ค๊ณ„ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š์•„์„œ ์ฒ˜์Œ์—” ํ—ท๊ฐˆ๋ฆฌ๊ธฐ๋„ ํ–ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํŒ€์›๋“ค๊ณผ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ณ  ์กฐ์œจํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ํฐ ๋ฐฐ์›€์ด ๋˜์—ˆ๋‹ค๊ณ  ๋А๋‚€๋‹ค. ์ •๋‹ต์€ ์—†์ง€๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ์—์„œ ์ ‘๊ทผํ•ด๋ณด๋Š” ๊ฒฝํ—˜์ด ์Œ“์ด๋‹ค ๋ณด๋ฉด ์ ์  ๋” ๋‚˜์€ ๊ธฐ์ค€์ด ์ƒ๊ธธ ๊ฒƒ์ด๋ผ ๋ฏฟ๋Š”๋‹ค.


๐Ÿ“Œ 4/24 - 7์ผ์ฐจ ํšŒ๊ณ  (ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ์™„๋ฃŒ)

 

์˜ค๋Š˜ ์ˆ˜์—… ์ฃผ์ œ๋ฅผ ๋ฏธ๋ฆฌ ํ™•์ธํ–ˆ์„ ๋•Œ, CI/CD๋Š” ๋ถ„๋ช… ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋ณต์Šต ๋ฐ ์ •๋ฆฌ๊นŒ์ง€ ํ•˜๋ฉด ๊ฝค ๋ฒ…์ฐฐ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์–ด์ œ ์•„ํ”ˆ ๋ชธ์„ ์ด๋Œ๊ณ , ์ €๋… ์‹œ๊ฐ„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋Œ€๋ถ€๋ถ„์„ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘์—ˆ๋‹ค. ์–ด์ œ ํ•˜๋ฃจ ์ข…์ผ(์˜ค์ „/์˜คํ›„) ์ˆ˜์—…์„ ์‰ฌ๊ณ  ํ‘น ์‰ฌ์–ด์„œ ๊ทธ๋Ÿฐ์ง€, ๊ทธ๋ฆฌ๊ณ  ์•ฝ์„ ์ดํ‹€ ์—ฐ์† ๊ผฌ๋ฐ•๊ผฌ๋ฐ• ์ฑ™๊ฒจ ๋จน์–ด์„œ ๊ทธ๋Ÿฐ์ง€, ์นจ๋„ ๋ชป ์‚ผํ‚ฌ ์ •๋„๋กœ ์•„ํŒ ๋˜ ๋ชฉ์ด ์˜ค๋Š˜์€ ๊ฝค ๊ดœ์ฐฎ์•„์กŒ๋‹ค ใ…‹ใ…‹
 
์•„๋ฌดํŠผ ๋•๋ถ„์— ์˜ค๋Š˜์€ ๋‚จ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊นŒ์ง€ ์•ฝ 3์‹œ๊ฐ„ ๋งŒ์— ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค๋ฅธ ํŒ€์›๋ถ„๋“ค๋„ ์ž‘์„ฑ์„ ๋งˆ์น˜๋ฉด, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ, ๋ธŒ๋žœ์น˜ ์ „๋žต ๋“ฑ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•œ ํ™˜๊ฒฝ ์„ธํŒ… ๋…ผ์˜์— ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋“œ๋””์–ด.. Appium ์ž๋™ํ™” ์ฝ”๋“œ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™๋‹ค! ๋‹ค๋งŒ ํ•œ ๊ฐ€์ง€ ๊ฑฑ์ •๋˜๋Š” ๊ฑด, Appium์ด Selenium๊ณผ ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ? ๊ธฐ๋ณธ ๊ฐœ๋…์€ ์ต์ˆ™ํ•œ๋ฐ, ์‹ค์ œ๋กœ ํ•ด๋ณด๋ฉด ๋˜ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ๋ถ€๋”ชํžˆ๋ฉด์„œ ์ตํ˜€๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“Œ 4/25 - 8์ผ์ฐจ ํšŒ๊ณ  (๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ๋„ค์ด๋ฐ ๊ทœ์น™ ํ™•์ •)

 

์‰ฌ๋Š” ์‹œ๊ฐ„์— ๋‹ค๋ฅธ ๋ถ„๋“ค ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ฒ€ํ† ํ•  ๊ฒธ Google ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๊นœ์ง ๋†€๋ž๋‹ค.
์Šคํ„ฐ๋””์›๋ถ„ ์ค‘ ํ•œ ๋ถ„์ด ์š”์•ฝ ๊ด€๋ จ ๋‚ด์šฉ์„ ์ •๋ง ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์ฃผ์…จ๋‹ค. ์™„์ „ ๋Šฅ๋ ฅ์ž!
 

์˜ค๋Š˜์€ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์ดˆ๊ธฐ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋น„๋กฏํ•ด ํŽ˜์ด์ง€ ํŒŒ์ผ๋ช…, ํŽ˜์ด์ง€ ํด๋ž˜์Šค๋ช…, ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋ช…, ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ช…, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ช…, ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, PR ์š”์ฒญ ๋ฐฉ์‹ ๋“ฑ์„ ๋ชจ๋‘ ๋…ผ์˜ํ•˜๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค. ์ดํ›„ ๋‚˜๋Š” ๋…ผ์˜ํ•œ ๋‚ด์šฉ์„ ๋”ฐ๋กœ Confluence ๋ฌธ์„œ์— ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค. ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•  ์ฐจ๋ก€๋‹ค!


๐Ÿ“Œ 4/28 - 11์ผ์ฐจ ํšŒ๊ณ  (์ดˆ์•ˆ ํ†ตํ•ฉ ๊ธฐ๋ฐ˜ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ธํŒ… ์™„๋ฃŒ)

 

์˜ค๋Š˜์€ ์ฃผ๋ง ๋™์•ˆ ํŒ€์› ๋ถ„๋“ค๊ป˜์„œ ์ž‘์„ฑํ•˜์‹  .env, capabilities.json, conftest.py, helpers.py ์ดˆ์•ˆ์„ ํ•ฉ์น˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ„๋„๋กœ, ์˜ค๋Š˜ ๊ฐ•์˜์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด helpers.py ์•ˆ์— ์žˆ๋˜ ์š”์†Œ ์ฐพ๊ธฐ/ํด๋ฆญ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ BasePage.py๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์ž‘์—…๋„ ์ถ”๊ฐ€๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ์ „ํžˆ helpers ๊ตฌ์กฐ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค. ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ utils์˜ helpers๊ฐ€ BasePage๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฑด ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๋ถ€๋ถ„์„ ๊ณ ๋ฏผํ•˜๋А๋ผ ํ•˜๋ฃจ๊ฐ€ ๋‹ค ๊ฐ€๋ฒ„๋ ธ๊ณ , ์–ด๋А์ƒˆ ์˜คํ›„ 11์‹œ๋ฅผ ๋„˜๊ฒผ๋‹ค. ์‹œ๊ฐ„์€ ๋งŽ์ด ๋“ค์˜€์ง€๋งŒ ๋พฐ์กฑํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์ง€ ๋ชปํ•ด ์•„์‰ฝ๋‹ค.
 
๊ทธ๋ž˜๋„ .env์™€ capabilities.json ๊ตฌ์„ฑ์€ ๊ฝค ๋งŒ์กฑ์Šค๋Ÿฝ๋‹ค. os.getenv๋ฅผ ์‚ฌ์šฉํ•ด .env ํŒŒ์ผ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๋“œ๋ผ์ด๋ฒ„ ์ƒ์„ฑ/์‚ญ์ œ ๊ณผ์ •๊ณผ ๋กœ๊ทธ์ธ ํ๋ฆ„๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋œ ์ ๋„ ๋งˆ์Œ์— ๋“ ๋‹ค. ๊ฒฐ๊ตญ ์ง€๊ธˆ ๊ฐ€์žฅ ํฐ ๊ณผ์ œ๋Š” helpers ๊ตฌ์กฐ๋ฅผ ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ“Œ 4/29 - 12์ผ์ฐจ ํšŒ๊ณ  (helpers ๊ฐœ์„  & ์ž๋™ํ™” ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ์ž‘)

 

์ ์‹ฌ์‹œ๊ฐ„์„ ์ด์šฉํ•ด์„œ ์–ด์ œ ํ•˜๋ฃจ์ข…์ผ ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋ง์”€ ๋“œ๋ ธ๊ณ , ๋‹คํ–‰ํžˆ ๋‹ค๋ฅธ ํŒ€์› ๋ถ„๋“ค๋„ ๊ณต๊ฐํ•ด์ฃผ์…”์„œ ๋‚˜์˜ ์˜๋„๋Œ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฒฐ๊ตญ helpers.py ๋‚ด Helper ํด๋ž˜์Šค๊ฐ€ BasePage ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ณ„๋„์˜ ํด๋ž˜์Šค ์—†์ด ๋‹จ์ˆœํžˆ ๋กœ๊ทธ์ธ ์œ ํ‹ธ ํ•จ์ˆ˜๋งŒ ์ž‘์„ฑํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ์ด์ œ ๋‚ด๊ฐ€ ๋งก์€ ํ™ˆ ํƒญ์˜ ์š”์†Œ๋“ค์„ ์ฐพ๊ณ , ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋“ค์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ์˜ค๋Š˜์€ ํ™ˆ ํƒญ๊ณผ ๊ด€๋ จ๋œ ์š”์†Œ๋“ค์„ ์ฐพ๊ณ , ํ™ˆ ํƒญ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ™ˆ ํŽ˜์ด์ง€์— ์Šค์™€์ดํ”„ ๊ด€๋ จ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋„ 7๊ฐœ์ •๋„ ์™„์„ฑํ–ˆ๋‹ค.


๐Ÿ“Œ 4/30 - 13์ผ์ฐจ ํšŒ๊ณ  (์š”์†Œ ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ & ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ถ”๊ฐ€)

 

์˜ค๋Š˜์€ ์•„์นจ์— ์ผ์–ด๋‚˜์ž๋งˆ์ž ์–ด์ œ ํŒ€์›๋ถ„๋“ค์ด ์˜ฌ๋ฆฐ PR์„ ํ™•์ธํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐํ•˜๋ฉด์„œ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ฌ์•˜๋‹ค. ๋‚˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํŒ€์›๋ถ„๋“ค๋„ ์„œ๋กœ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉด์„œ ๊ฐ์ž ๊ฐœ์„  ๋ฐฉํ–ฅ์„ ์ด์•ผ๊ธฐํ•ด์คฌ๊ณ , ๊ทธ ๊ณผ์ •์ด ๊ฝค ์œ ์ตํ–ˆ๋‹ค. ๊ทธ์ค‘์— ํ•œ ํŒ€์›๋ถ„์ด XPath ๋Œ€์‹  id๋‚˜ content-desc๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ACCESSIBILITY_ID๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฟ€ํŒ์„ ์•Œ๋ ค์ฃผ์…จ๋‹ค. ๋•๋ถ„์— ๋‚ด๊ฐ€ ๋งก์€ ํ™ˆ ํƒญ ์š”์†Œ ์ค‘ ์ผ๋ถ€๋ฅผ XPath ๋Œ€์‹  id ๊ธฐ๋ฐ˜์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ํ™•์‹คํžˆ ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์ง€๊ณ , ํ…Œ์ŠคํŠธ ์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ๋„ ๋” ๋‚˜์€ ์„ ํƒ์ด๋ผ๊ณ  ๋А๊ผˆ๋‹ค. ์š”์†Œ ์ˆ˜์ •์ด ๋๋‚œ ๋’ค์—๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋„ ๋ช‡ ๊ฐœ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ธ๊ธฐ ๊ด€๊ด‘์ง€ ํ˜ผ์žก๋„ ์˜์—ญ์—์„œ ๊ณ„์† "๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜๊ฐ€ ๋– ์„œ ์˜ˆ์ƒ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋งŽ์ด ์ง€์ฒด๋˜์—ˆ๊ณ , ๊ฒฐ๊ตญ ์ž‘์—…์„ ์กฐ๊ธˆ ๊ธ‰ํ•˜๊ฒŒ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค.
 
์ถ”๊ฐ€๋กœ, ๋ช‡๋ช‡ ํŒ€์›๋ถ„๋“ค์ด ์š”์†Œ๋“ค์„ ํด๋ž˜์Šค ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ •์˜ํ•˜๊ณ  ๊ณ„์…”์„œ, ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋„ ์–ด๋–ค ๋ฐฉ์‹์ด ๋” ํšจ์œจ์ ์ธ์ง€ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•˜๋‹ค. ์•„์ง ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์€ ์—†์ง€๋งŒ, ๋ณ€์ˆ˜ ๋‹จ์œ„๋กœ ํ• ์ง€, ๊ด€๋ จ๋œ ์š”์†Œ๋ผ๋ฆฌ ํด๋ž˜์Šค๋กœ ๋ฌถ์„์ง€ ๋” ๊ณ ๋ฏผํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์˜ค๋Š˜ ํŒ€์› ๋•๋ถ„์— @staticmethod ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋„ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์„œ๋กœ ์ฝ”๋“œ ๋ณด๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐฐ์›Œ๊ฐ€๋Š” ํ๋ฆ„์ด ์ •๋ง ์ข‹๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


๐Ÿ“Œ 5/1 - 14์ผ์ฐจ ํšŒ๊ณ  (mark ์ถ”๊ฐ€ & ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ถ”๊ฐ€)

 

์˜ค๋Š˜์€ ๊ณตํœด์ผ์ด๋ผ ์˜ค๋žœ๋งŒ์— ๋Šฆ์ž ์„ ์ž๊ณ , ํ•˜๋ฃจ ์ข…์ผ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. TMI ํ•˜๋‚˜ ํ’€์ž๋ฉด, ๋น„๋ฅผ ๋šซ๊ณ  ๊ณต์œ  ์˜คํ”ผ์Šค์— ๋„์ฐฉํ–ˆ๋Š”๋ฐ ๊ณต๊ธฐ๊ณ„์™€ ์—ฐ๊ฒฐ์„ ์„ ๊นœ๋นกํ•˜๊ณ  ๋‘๊ณ  ์˜จ ๊ฑฐ๋‹ค. ์™•๋ณต 30๋ถ„์„ ํ—ˆ๋น„ํ•˜๊ณ  ์˜ท๋„ ๋‹ค ์ –์—ˆ๋‹ค. ์ง„์งœ ์ตœ์•…์˜ ํšจ์œจ...
 
์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ์ฝ”๋“œ์— @pytest.mark.skip ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ฌ์•„ ๊ตฌ๋ถ„ํ•ด์™”๋Š”๋ฐ, ์™ธ๋ถ€ ์š”์ธ(๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์˜ค๋ฅ˜)์œผ๋กœ ๊ฐœ๋ฐœ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋‹ค ๋ณด๋‹ˆ ์„œ๋กœ ๊ตฌ๋ถ„์ด ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒ€์›๋ถ„๋“ค๊ป˜ ์ƒˆ๋กœ์šด mark๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๊ณ  ์ œ์•ˆ๋“œ๋ ธ๊ณ , ๋‹ค๋“ค ๋™์˜ํ•ด์ฃผ์…”์„œ ๋ฐ˜์˜ํ–ˆ๋‹ค. ๋•๋ถ„์— ํ…Œ์ŠคํŠธ ์ƒํƒœ๋ฅผ ๋” ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
 
์ˆ˜์—…์ด ์—†๋Š” ๋‚ ์ด๋ผ ์ฒด๋ ฅ์„ 100% ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ๋งŒํผ ๋งŽ์€ ์ž‘์—…์„ ํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ๋ง๊นŒ์ง€๋Š” ๊ผญ ์ฝ”๋“œ ๊ฐœ๋ฐœ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์‹ถ์€๋ฐ, ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์˜ค๋ฅ˜๊ฐ€ ์—ฌ์ „ํžˆ ๋ฐœ๋ชฉ์„ ์žก๊ณ  ์žˆ๋‹ค. ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์š”์†Œ๊ฐ€ ๊ผฌ์ด๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„ ์ œ๋Œ€๋กœ ๋œ ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ์ด ์–ด๋ ค์šด ์ƒํ™ฉ์ด๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‚˜ ํ…Œ์ŠคํŠธ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•  ํ…๋ฐ.. ๊ฑฑ์ •์ด ํฌ๋‹ค.
 
5์›” 2์ผ Jenkins ํŠน๊ฐ• ์ดํ›„์—๋Š” 2์ฐจ ํ”„๋กœ์ ํŠธ ๊ด€๋ จ OT๊ฐ€ ์˜ˆ์ •๋˜์–ด ์žˆ๊ณ , ์ดํ›„ ํŒ€๋ณ„ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์ด ๊ฐœ์„ค๋˜๋ฉด 5์›” 7์ผ ์ „๊นŒ์ง€ ๊ฐ ํŒ€์ด ๋ณธ๊ฒฉ์ ์ธ ํ”„๋กœ์ ํŠธ ์ค€๋น„์— ๋“ค์–ด๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜์ž๊ณ  ๊ฐ•์š”ํ•  ์ˆ˜๋Š” ์—†๋Š” ์ƒํ™ฉ์ด๋‹ค. 2์ฐจ ์Šคํ„ฐ๋””๋Š” 1์ฐจ๋ณด๋‹ค ๋ฒ”์œ„๊ฐ€ ๋„“๊ณ , API ๋ฐ ์„ฑ๋Šฅ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋Š” ๋ฌผ๋ก  CI/CD๋„ ํ•„์ˆ˜ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” Appium ๊ฒฝํ—˜์„ ์Œ“๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด์—ˆ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋น„๋กฏํ•ด ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์—์„œ ๋ฐœ์ „์„ ์ด๋ค„๋ƒˆ๋‹ค๋Š” ์ ์—์„œ ์ถฉ๋ถ„ํžˆ ๋งŒ์กฑ์Šค๋Ÿฝ๋‹ค. ๊ทธ๋ž˜๋„ 2์ฐจ ์Šคํ„ฐ๋”” ์ „๊นŒ์ง€ ์ตœ๋Œ€ํ•œ ํ•ด๋ณด๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ์‚ผ์•„๋ณด๋ ค ํ•œ๋‹ค.


๐Ÿ“Œ 5/2 - 15์ผ์ฐจ ํšŒ๊ณ  (๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์˜ค๋ฅ˜ ์ผ๋ถ€ ์™„ํ™”๋กœ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ถ”๊ฐ€)

 
์˜ค๋Š˜์€ Jenkins ํŠน๊ฐ•์— ์ด์–ด 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ OT๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๊ณ , OT ์ดํ›„์—๋Š” ํŒ€์›๋“ค๊ณผ ์˜คํ”„๋ผ์ธ ์ผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋А๋ผ ํ•˜๋ฃจ ์ข…์ผ ์ •์‹ ์ด ์—†์—ˆ๋‹ค. ๋ง‰ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•˜๋ ค๋˜ ์ฐฐ๋‚˜, 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋…ธ์…˜ ๊ณต์ง€๊ฐ€ ์˜ฌ๋ผ์™€ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ์™€ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ณ  ํŒ€์›๋“ค๊ณผ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๋А๋ผ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
 
๊ทธ๋‚˜๋งˆ ๋‹คํ–‰์ธ ์ ์€, ์˜ค๋Š˜ ์Šคํ„ฐ๋”” ํŒ€์›๋ถ„๊ป˜์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์†Œ ์™„ํ™”๋œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์…”์„œ ํ™•์ธํ•ด๋ณด์•˜๊ณ , ์‹ค์ œ๋กœ ์ธ๊ธฐ ๊ด€๊ด‘์ง€ ํ˜ผ์žก๋„ ๊ด€๋ จ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋œ ์ƒํƒœ์˜€๋‹ค. ๋•๋ถ„์— ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋Š” ์ „๋ถ€ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€์—ญ ํƒ๋ฐฉ ํŽ˜์ด์ง€๋Š” ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์˜ค๋ฅ˜๊ฐ€ ์ง€์†๋˜๊ณ  ์žˆ๋‹ค. ๋กœ๋”ฉ๋งŒ ๋œ๋‹ค๋ฉด ๋‹น์žฅ์ด๋ผ๋„ ๊ตฌํ˜„ํ•  ์ž์‹ ์ด ์žˆ๋Š”๋ฐ.. ์ •๋ง ๋‹ต๋‹ตํ•˜๊ณ  ์งœ์ฆ ๋‚œ๋‹ค.


๐Ÿ“Œ 5/3 - 16์ผ์ฐจ ํšŒ๊ณ  (ํ™ˆ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ์™„๋ฃŒ)

 
์˜ค๋Š˜์€ ์ง€์—ญ ํƒ๋ฐฉ ํŽ˜์ด์ง€ ๊ด€๋ จ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์–ด ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์‹œ/๋„, ์žฅ์†Œ ์œ ํ˜• ํ•„ํ„ฐ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ, ์‹œ/๊ตฐ/๊ตฌ ํ•„ํ„ฐ๋Š” ์—ฌ์ „ํžˆ ์ •์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š์•„ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ์ž๊พธ Fail๋กœ ๋œจ๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค. ๋ฌผ๋ก  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๋•Œ๋งˆ๋‹ค ์งœ์ฆ์ด ๋‚˜๊ธด ํ•˜์ง€๋งŒ, ์•ฑ ๊ธฐ๋Šฅ ์ž์ฒด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ์ผ์ด๋‹ค.
 
๋˜ํ•œ, ๋‹ค๋ฅธ ํƒญ์—์„œ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด์•ผ๋งŒ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ๋“ค์€ ์ž๋™ํ™”๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์ผ€์ด์Šค๋“ค์€ Google Spreadsheet ์ƒ์—์„œ Test Type์„ '์ž๋™ํ™”'๊ฐ€ ์•„๋‹Œ '์ˆ˜๋™'์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ธฐ๋กํ•ด๋‘์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ, ์ „๊ตญ ๋‚ ์”จ ์œ„์ ฏ ์ •๋ณด๊ฐ€ ์–ด๋””์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š”์ง€, ์ •์ƒ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™”๋Š”์ง€, ์ธ๊ธฐ ๊ด€๊ด‘์ง€ ํ˜ผ์žก๋„๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐฑ์‹ ๋˜๋Š”์ง€, ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ตœ์‹  ์ •๋ณด๊ฐ€ ์ •๋ง ๋ฐ˜์˜๋˜๋Š”์ง€ ๋“ฑ์˜ ํ•ญ๋ชฉ๋“ค์€ ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ๋‚˜ API ๋ฌธ์„œ์—์„œ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์ •ํ™•ํ•œ ๊ธฐ์ค€์„ ์„ธ์šฐ๊ธฐ ์–ด๋ ค์› ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ€์ด์Šค๋“ค๋„ ์ผ๋‹จ์€ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค.
 
๋‹จ, ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋‹ค๋ฅธ ํƒญ์—์„œ์˜ ์„ ํ–‰ ๋™์ž‘์ด ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋Š”, ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ๋ฆ„ ์•ˆ์—์„œ ์„ ํ–‰ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ์ƒํƒœ์—์„œ ๊ฒ€์ฆํ•˜๊ณ ์ž ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ด์–ด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•Œ๋ฆผ ๊ด€๋ จ ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ ํŠน์ • ์กฐ๊ฑด์ด ์„ ํ–‰๋˜์–ด์•ผ๋งŒ ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ์กฐ๊ฑด์„ ๋จผ์ € ์ถฉ์กฑ์‹œํ‚จ ๋’ค ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ๋ฆ„์„ ๊ตฌ์„ฑํ•˜๋ฉด ์ž๋™ํ™”๋„ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
 
pytest๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๊ณผ ํ•จ์ˆ˜๋“ค์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ ์„ ํ–‰ ์กฐ๊ฑด์ด ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋ ค๋ฉด ํŒŒ์ผ๋ช…์ด๋‚˜ ํ•จ์ˆ˜๋ช…์— ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ฐ˜์˜ํ•˜๊ฑฐ๋‚˜, pytest-order์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ช…์‹œ์ ์ธ ์ˆœ์„œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฌผ๋ก  ํ…Œ์ŠคํŠธ๋Š” ์ˆœ์„œ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ด์ƒ์ ์ด์ง€๋งŒ, ํ˜„์‹ค์ ์œผ๋กœ๋Š” ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฝ์šฐ๋„ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์ธ ์ ‘๊ทผ์ด๋ผ ์ƒ๊ฐ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ผ์ •์ƒ ์‹œ๊ฐ„ ์—ฌ์œ ๊ฐ€ ๋งŽ์ง€ ์•Š์•„, ์ด๋ฒˆ์—๋Š” ํ•ด๋‹น ์•„์ด๋””์–ด๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด์ง€๋Š” ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค์Œ์— ์‹œ๊ฐ„์ด ๋” ํ—ˆ๋ฝ๋œ๋‹ค๋ฉด ๊ผญ ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ณผ์ œ ์ค‘ ํ•˜๋‚˜๋‹ค.
 
ํ˜„์žฌ๋Š” 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ์ค€๋น„๋„ ๋ณ‘ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ, ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ž‘์„ฑ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž‘์—…์„ ๋งˆ์ณค๊ณ , ๋‚จ์€ ๊ธฐ๊ฐ„ ๋™์•ˆ์—๋Š” parameterization์œผ๋กœ ์„ ์–ธ๋œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ testdata ํด๋”๋กœ ์ •๋ฆฌํ•˜๊ณ , Jenkins ์—ฐ๋™ ์ž‘์—…์„ ํ•จ๊ป˜ ์ง„ํ–‰ํ•  ๊ณ„ํš์ด๋‹ค.


๐Ÿ“Œ 5/4 - 17์ผ์ฐจ ํšŒ๊ณ  (ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋ถ„๋ฆฌ)

 
ํ•˜๋“œ์ฝ”๋”ฉ๋˜๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„ .py ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒํ•˜๊ณ ์ž ํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ˆ˜์—… ์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ ๋ฐฉ์‹๋Œ€๋กœ json ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.
 
์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

@pytest.mark.parametrize("expected_regions", [
    ["์„œ์šธ", "๋ถ€์‚ฐ", "๋Œ€๊ตฌ", "์ธ์ฒœ", "๊ด‘์ฃผ", "๋Œ€์ „", "์šธ์‚ฐ", "๊ฒฝ๊ธฐ", "๊ฐ•์›", "์ œ์ฃผ"]
])

 
ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด locator ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์—์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.

@pytest.mark.parametrize("locator, region_name", [ 
    (HomeLocator.CONGESTION_SEOUL_BTN, "์„œ์šธ"), # test_hp_05_05
    (HomeLocator.CONGESTION_BUSAN_BTN, "๋ถ€์‚ฐ"), # test_hp_05_06
    # ...
])

 
json์€ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํฌ๋งท์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ ์ •๋„๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒ์ด์ฌ์˜ ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด๋Š” ์ €์žฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•˜๊ณ  ์ฝ”๋“œ์—์„œ getattr()์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

# json
{ "city": "REGION_TOUR_CITY_DAEGU" }

# python
getattr(HomeLocator, "REGION_TOUR_CITY_DAEGU")

 
์ด๋Š” ๋„ˆ๋ฌด ๊ท€์ฐฎ๋‹ค. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ ค๋‹ค ๋” ๋ณต์žกํ•ด์ง€๋Š” ์•„์ด๋Ÿฌ๋‹ˆํ•œ ์ƒํ™ฉ์— ์ง๋ฉดํ•œ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ ์ƒ๊ฐ์„ ๋ฐ”๊ฟจ๋‹ค. ๊ผญ json์ด์–ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†์ง€ ์•Š๋‚˜? ๊ทธ๋ƒฅ .py ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ  importํ•ด์„œ ์“ฐ๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„๊นŒ?
 
๐Ÿ’ก ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ Python ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ

from src.utils.locators import HomeLocator

# ๐Ÿ“Œ ์ธ๊ธฐ ๊ด€๊ด‘์ง€ ํ˜ผ์žก๋„
# test_hp_05_04 (์ธ๊ธฐ ๊ด€๊ด‘์ง€ ํ˜ผ์žก๋„์˜ ์ง€์—ญ ํ•„ํ„ฐ ์ค‘ '์ „์ฒด' ํ•„ํ„ฐ ํ™•์ธ)
expected_regions = ["์„œ์šธ", "๋ถ€์‚ฐ", "๋Œ€๊ตฌ", "์ธ์ฒœ", "๊ด‘์ฃผ", "๋Œ€์ „", "์šธ์‚ฐ", "๊ฒฝ๊ธฐ", "๊ฐ•์›", "์ œ์ฃผ"]

# test_hp_05_05 ~ test_hp_05_14 (์ธ๊ธฐ ๊ด€๊ด‘์ง€ ํ˜ผ์žก๋„์˜ ์ง€์—ญ ํ•„ํ„ฐ ์ค‘ '์„œ์šธ/๋ถ€์‚ฐ/๋Œ€๊ตฌ/์ธ์ฒœ/๊ด‘์ฃผ/๋Œ€์ „/์šธ์‚ฐ/๊ฒฝ๊ธฐ/๊ฐ•์›/์ œ์ฃผ' ํ•„ํ„ฐ ํ™•์ธ)
locator__region_name = [ 
    (HomeLocator.CONGESTION_SEOUL_BTN, "์„œ์šธ"), # test_hp_05_05
    (HomeLocator.CONGESTION_BUSAN_BTN, "๋ถ€์‚ฐ"), # test_hp_05_06
    # ...
]

 
๐Ÿ’ก ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ

def test_hp_05_04(...):
    ...
    assert any(region in first_result_desc for region in HomeTestData.expected_regions)

@pytest.mark.parametrize("locator, region_name", HomeTestData.locator__region_name)
def test_hp_05_05(...):
    ...

 
์ฒ˜์Œ์—” expected_regions์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๊นŒ์ง€ ๋ถ„๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ํ–ฅํ›„ ์ง€์—ญ์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ•ด๋‹น ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋„ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿด ๋•Œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ณด๋‹ค ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋‹ˆ, ์˜คํžˆ๋ ค ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋” ์‰ฌ์›Œ์งˆ ๊ฒƒ์ด๋‹ค.
 
ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ ๊นจ๋‹ฌ์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด, "ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋งž๋Š” ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž๋™ํ™”์˜ ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ฒฐ์ •์ง“๋Š”๋‹ค"๋Š” ์ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž ๋“ฑ์€ json, csv ๊ฐ™์€ ํฌ๋งท์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋œ๋‹ค๋ฉด ๋ณต์žกํ•œ ํŒŒ์‹ฑ๋ณด๋‹ค๋Š” .py ํŒŒ์ผ์— ์ •์˜ํ•˜๊ณ  importํ•˜๋Š” ๋ฐฉ์‹์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•˜๋‹ค. ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋ฅผ ํ•  ๋•Œ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๋ฐฉ์‹, ํŒ€์˜ ํ˜‘์—… ๋ฐฉ์‹๊นŒ์ง€ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์„œ ๊ฐ€์žฅ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ข‹์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ง์ ‘ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿ“Œ 5/5 - 18์ผ์ฐจ ํšŒ๊ณ  (YAML ์ œ์ž‘ & Jenkins ์—ฐ๋™ & Jira ์ด์Šˆ ๋“ฑ๋ก)

 
1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ, Jenkins์™€ Git ์—ฐ๋™์— ์„ฑ๊ณตํ•œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ณต์‹ Jenkins ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ํŒ€ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ด์„œ ๋ฒˆ๊ฑฐ๋กœ์› ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด "Jenkins + Git Plugin + GitLab Plugin + Python3 + ๊ฐ€์ƒํ™˜๊ฒฝ + Chrome"์ด ํฌํ•จ๋œ ์ปค์Šคํ…€ Dockerfile์„ ์ง์ ‘ ์ž‘์„ฑํ•ด ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ–ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํŒ€์›๋“ค๊ณผ ๋™์ผํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 
๋ฐ˜๋ฉด, ์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” GitLab์ด ์•„๋‹Œ GitHub ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ๊ณ , 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ์—๋Š” ์ž˜ ๋ชฐ๋ž๋˜ ๋ณผ๋ฅจ ๊ฐœ๋…์ด๋‚˜ docker-compose.yaml ๊ฐ™์€ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์ฝ”์น˜๋‹˜์ด ์ง„ํ–‰ํ•˜์‹  JMeter CI ์—ฐ๋™ ์‹ค์Šต์„ ํ†ตํ•ด ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” ๋‹จ์ˆœํžˆ Jenkins ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ทธ์น˜์ง€ ์•Š๊ณ , ํ™˜๊ฒฝ ์„ค์ • ์ž๋™ํ™”์™€ ์žฌํ˜„์„ฑ๊นŒ์ง€ ๊ณ ๋ คํ•œ ๋” ๋ฐœ์ „๋œ YAML ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด๋ ค ํ•œ๋‹ค.
 
โฌ‡๏ธ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  ๊ธ€

[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 9~10์ฃผ์ฐจ] 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

โ„น๏ธ ํ”„๋กœ์ ํŠธ ๊ฐ€์ด๋“œ๐Ÿ“Œ 3/21 - 1์ผ์ฐจ ํšŒ๊ณ  (๋Œ€์ƒ ์„œ๋น„์Šค ํŒŒ์•… ๋ฐ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์„ธํŒ…) ์–ด์ œ ์ˆ˜์—…์ด ๋๋‚œ ํ›„ ์˜คํ›„ 8์‹œ 30๋ถ„ ๊ธฐ์ฐจ๋ฅผ ํƒ€๊ณ  ์„œ์šธ๋กœ ์˜ฌ๋ผ์™”๋‹ค. ์ง์„ ๋Œ€์ถฉ ํ’€๊ณ  ๋‚˜๋‹ˆ ์–ด๋А๋ง ๋ฐค 11์‹œ๊ฐ€ ํ›Œ

isliife2.tistory.com

 
โฌ‡๏ธ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ Dockerfile

๋”๋ณด๊ธฐ
FROM jenkins/jenkins:lts

USER root

# ํ•„์ˆ˜ ๋„๊ตฌ ์„ค์น˜
RUN apt-get update && apt-get install -y \
    python3 python3-pip python3-venv \
    git \
    curl wget unzip gnupg2 && \
    apt-get clean

# Chrome ์„ค์น˜
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
    apt-get install -y ./google-chrome-stable_current_amd64.deb && \
    rm google-chrome-stable_current_amd64.deb

# Git, GitLab ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง์ ‘ ์„ค์น˜
RUN jenkins-plugin-cli --plugins \
    git \
    gitlab-plugin \
    workflow-aggregator \
    credentials-binding

USER jenkins

 
๐Ÿ”ฅ dockerfile -> yaml
1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ์—๋Š” Jenkins์— ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ์ง์ ‘ ์„ค์น˜ํ•œ Dockerfile์„ ์ž‘์„ฑํ–ˆ๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜๋™์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ–ˆ๋‹ค.

sudo docker build -t {์ด๋ฏธ์ง€ ์ด๋ฆ„} .

 
๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜์ฒ˜๋Ÿผ  ์ง์ ‘ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์› ๋‹ค.

sudo docker run -d -p{์™ธ๋ถ€ ํฌํŠธ}:{์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํฌํŠธ} -p 50000:50000 --name {์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„} {์ด๋ฏธ์ง€ ์ด๋ฆ„}


์ด ๊ณผ์ •์€ ๋งค๋ฒˆ ํƒ€์ดํ•‘๋„ ๋ฒˆ๊ฑฐ๋กญ๊ณ , ์‹ค์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์˜ต์…˜์„ ๋นผ๋จน์œผ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค Jenkins ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณผ๋ฅจ ๊ฐœ๋…์กฐ์ฐจ ๋ชจ๋ฅด๋˜ ์‹œ์ ˆ์ด๋ผ, ๋„์ปค ๋ฐ์Šคํฌํƒ‘์„ ์ผœ๋ณด๋ฉด ๋ฌด์ž‘์œ„ ํ•ด์‹œ์ฒ˜๋Ÿผ ์ƒ๊ธด ์ด๋ฆ„์˜ ๋ณผ๋ฅจ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋“ค์ด ๋–  ์žˆ์—ˆ๊ณ , โ€œ์ด๊ฑด ๋ญ์ง€?โ€ ์‹ถ์–ด ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์ง€์šด ์ ๋„ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ, ๋ณผ๋ฅจ์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ด๋ฉฐ, ๋‘ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•ด์„œ ์ดํ•ดํ•˜๊ณ  ์ง์ ‘ ์ด๋ฆ„์„ ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ๊ด€๋ฆฌ์— ์žˆ์–ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค.
 
์ดํ›„, ์ฝ”์น˜๋‹˜์ด ์ง„ํ–‰ํ•˜์‹  JMeter CI ์—ฐ๋™ ์‹ค์Šต์„ ํ†ตํ•ด docker-compose.yaml์ด๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ด์ œ๋Š” Dockerfile๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ๊ฑธ yaml์—์„œ ์ฐธ์กฐํ•ด์„œ ์ „์ฒด ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํ•œ ์ค„๋กœ ์ž๋™ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

docker-compose up -d --build

 
์ด ๋ช…๋ น์–ด ํ•˜๋‚˜๋งŒ์œผ๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ถ€ํ„ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰, ํฌํŠธ ์„ค์ •, ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๊นŒ์ง€ ๋ชจ๋‘ ์ž๋™ํ™”๋œ๋‹ค. ์ด์ œ๋Š” ๋ณผ๋ฅจ๊ณผ ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋„์ปค ๋ฐ์Šคํฌํƒ‘์—์„œ๋„ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ์‹ค์ˆ˜๋„ ์ค„์—ˆ๋‹ค. ์ด ์™ธ์—๋„ .gitignore์— .env ํŒŒ์ผ๊ณผ capabilities ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Jenkins์—์„œ๋Š” ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ credentials์˜ Secret file๋กœ ๋“ฑ๋กํ•ด ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
 
โฌ‡๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ Dockerfile

๋”๋ณด๊ธฐ
FROM jenkins/jenkins:lts

USER root

# ํ•„์ˆ˜ ํŒจํ‚ค์ง€ + OpenCV ์˜์กด์„ฑ(libGL)
RUN apt-get update && apt-get install -y \
    python3 python3-pip python3-venv \
    curl unzip git \
    libgl1-mesa-glx \
    software-properties-common apt-transport-https \
    && apt-get clean

# pip ์ตœ์‹ ํ™”
RUN python3 -m pip install --upgrade pip --break-system-packages

# Jenkins GitHub ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์„ค์น˜
RUN jenkins-plugin-cli --plugins \
    git \
    github \
    workflow-aggregator \
    credentials-binding

USER jenkins

 
โฌ‡๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ docker-compose.yaml

๋”๋ณด๊ธฐ
version: "3.8"

services:
  jenkins:
    image: appium_jenkins
    build:
      context: .
      dockerfile: Dockerfile
    container_name: appium_jenkins
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - appium_jenkins:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    user: root

volumes:
  appium_jenkins:

 
โฌ‡๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ Jenkinsfile

๋”๋ณด๊ธฐ
pipeline {
    agent any

    environment {
        ENV_FILE = credentials('env-file')                  // .env ํŒŒ์ผ
        CAP_FILE = credentials('capabilities-file')         // capabilities.json ํŒŒ์ผ
    }

    stages {
        stage('Run Appium Tests') {
            steps {
                sh '''
                    # ๊ธฐ์กด ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•  ๊ฒฝ์šฐ ์‚ญ์ œ
                    rm -f src/config/.env
                    rm -f src/config/capabilities.json

                    # Credentials๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌ
                    cp "$ENV_FILE" src/config/.env
                    cp "$CAP_FILE" src/config/capabilities.json

                    # ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ • ๋ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰
                    python3 -m venv venv
                    . venv/bin/activate
                    pip install -r requirements.txt
                    pytest tests/test_Home.py
                '''
            }
        }
    }
}

 
โฌ‡๏ธ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ requirements.txt

๋”๋ณด๊ธฐ
pytest
Appium-Python-Client
python-dotenv
selenium
pytz
requests
opencv-python

 
์ดํ›„ Appium ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ธฐ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•œ ๋’ค Jenkins ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ, ์ด ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
 
๊ธฐ์กด .env ํŒŒ์ผ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Appium ์„œ๋ฒ„ ์ฃผ์†Œ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์—ˆ๋‹ค.

APPIUM_SERVER_URL="http://127.0.0.1:4723"

 
ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ์ด 127.0.0.1 ์ฃผ์†Œ ๋•Œ๋ฌธ์ด๋‹ค. Appium ์„œ๋ฒ„๋ฅผ ์ง์ ‘ cmd์—์„œ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

http://127.0.0.1:4723/ (only accessible from the same host)

์ฆ‰, ์ด ์ฃผ์†Œ๋Š” "๊ฐ™์€ ํ˜ธ์ŠคํŠธ(๋จธ์‹ ) ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค"๋Š” ๋œป์ด๋‹ค.
 
๋ฐ˜๋ฉด, ๊ทธ ์•„๋ž˜์— ๋‚˜์—ด๋œ ๋‹ค๋ฅธ ์ฃผ์†Œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค:

You can provide the following URLs in your client code to connect to this server:
http://192.168.xx.xx:4723/ ...

์ด๋Ÿฌํ•œ IP ์ฃผ์†Œ๋“ค์€ ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์—, Docker ์ปจํ…Œ์ด๋„ˆ๋‚˜ Jenkins ํ™˜๊ฒฝ, ํ˜น์€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ๋„ Appium ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
์ •๋ฆฌํ•˜์ž๋ฉด:

  • 127.0.0.1 = ๋ฃจํ”„๋ฐฑ ์ฃผ์†Œ(localhost)
    -> Appium ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ ๊ฐ™์€ ์ปดํ“จํ„ฐ ์•ˆ์˜ ํ”„๋กœ๊ทธ๋žจ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋ฐ˜๋ฉด 192.168.xx.xx์™€ ๊ฐ™์€ ์ฃผ์†Œ
    -> ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋‹ค๋ฅธ ํ™˜๊ฒฝ (์˜ˆ: Docker ์ปจํ…Œ์ด๋„ˆ, Jenkins ๋“ฑ)์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ

 
๋”ฐ๋ผ์„œ Jenkins๋‚˜ pytest๊ฐ€ Docker ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๋‹ค๋ฅธ ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ํ™˜๊ฒฝ์˜ 127.0.0.1์€ Appium ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ๋ฌธ์— Appium ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๊ณ , Connection refused ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.
 

์ฃผ์†Œ๋งŒ ์ˆ˜์ •ํ•ด์ฃผ๋‹ˆ ์ •๋ง ๋ฌธ์ œ์—†์ด ์ž˜ ๋Œ์•„๊ฐ„๋‹ค! ์ด์ œ๋Š” Jenkins ์—ฐ๋™์ด ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๋А๊ปด์งˆ ๋งŒํผ, ๋‚˜ ์ž์‹ ์ด ๋งŽ์ด ์„ฑ์žฅํ–ˆ์Œ์„ ์‹ค๊ฐํ•œ๋‹ค. ์ง€๋‚œ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ ์˜จ๊ฐ– ์˜ค๋ฅ˜๋ฅผ ๊ฒช์œผ๋ฉฐ ์—ฐ๋™ ๋ฐฉ๋ฒ•์„ ์ตํ˜”๋˜ ๊ฒฝํ—˜ ๋•๋ถ„์—, ์ด๋ฒˆ์—๋Š” ํ›จ์”ฌ ์ˆ˜์›”ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ๊ทธ๋ž˜์„œ ๋”์šฑ ๋ฟŒ๋“ฏํ•˜๋‹ค. ๋ฌผ๋ก  ์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ๊ณต์œ  ์„œ๋ฒ„๋ฅผ ์ œ๊ณต๋ฐ›์ง€ ๋ชปํ•ด ngrok์„ ์ด์šฉํ•  ์ˆ˜๋ฐ–์— ์—†์ง€๋งŒ, ๋‹ค์Œ 2์ฐจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” HTML ๋ฆฌํฌํŠธ๊นŒ์ง€ ์—ฐ๋™ํ•ด๋ณด๋ฉด ์ง„์งœ ์™„๋ฒฝํ•œ Jenkins ์ž๋™ํ™”๊ฐ€ ์™„์„ฑ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ์—๋Š” YAML ์ž‘์„ฑ๊ณผ Appium ์—ฐ๋™๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ์˜€๋‹ค.
 

ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜, ํŒ€์›๋ถ„๊ป˜์„œ ๋ณธ์ธ์ด ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜์‹œ๋˜ ๋ฐฉ์‹๋Œ€๋กœ Jira ์ด์Šˆ ๋“ฑ๋ก์šฉ ํ…œํ”Œ๋ฆฟ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ฃผ์…จ๋‹ค. ๊ฑฐ๊ธฐ์— ๋”ํ•ด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋„ ์˜์ƒ์œผ๋กœ ์ง์ ‘ ์ฐ์–ด์„œ ๊ณต์œ ํ•ด์ฃผ์‹œ๊ณ , ๋ฌธ์„œ๋กœ๋„ ์ •๋ฆฌํ•ด์ฃผ์…จ๋‹ค. ์ •๋ง ๋Šฅ๋ ฅ์ž ๊ทธ ์ž์ฒด์˜€๋‹ค. ์‚ฌ์‹ค ๋‚˜๋„ Jira ์ด์Šˆ ๋“ฑ๋ก์„ ๊นœ๋นกํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋Š˜ ๋‹ค๋ฅธ ํŒ€์›๋ถ„๊ป˜์„œ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐœ๊ฒฌ๋œ ์ด์Šˆ๋“ค์„ Jira์— ๋“ฑ๋กํ•ด๋‘์…จ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ์…จ๋‹ค. ๋•๋ถ„์— ๋‚˜๋„ ๋ฏธ๋ฆฌ ์ •๋ฆฌํ•ด๋‘” ์ด์Šˆ๋“ค์„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

๊ฒŒ๋‹ค๊ฐ€ Google Spreadsheet์— ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๊นŒ์ง€ ์ž‘์„ฑํ•ด๋‘์…จ๊ณ , ๊ทธ๊ฑธ ๋ณด๊ณ  ๋‚œ ์ •๋ง ๊ฐ๋™ํ•ด์„œ ๊ธ‰ํžˆ ๋‹ค์‹œ ์ฑ…์ƒ์— ์•‰์•„ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ดค๋‹ค. ๋ฌธ์„œ ์ •๋ฆฌ, ์˜๊ฒฌ ์ „๋‹ฌ, ์ž๋ฃŒ ๊ณต์œ  ๋ฐฉ์‹๊นŒ์ง€.. ์ง„์‹ฌ์œผ๋กœ ๋ฐฐ์šธ ์ ์ด ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ, ๊ทธ๋ ‡๊ฒŒ ์„ฑ์‹คํ•˜๊ณ  ์—ด์ •์ ์ธ ๋ถ„๋“คํ•œํ…Œ ๋ฐ˜ํ•  ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ฑฐ์ง“๋ง ํ•˜๋‚˜ ์•ˆ ๋ณดํƒœ๊ณ , ์ง„์งœ ์„ค๋ œ๋‹ค ใ…‹ใ…‹ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ํ•œ ํŒ€์›๋ถ„๋“ค์˜ ํ˜‘์—… ๋ฐฉ์‹์„ ๋ณด๋ฉด์„œ โ€˜์™€.. ๋Œ€๋ฐ•..โ€™์ด๋ผ๋Š” ๋ง์ด ์ ˆ๋กœ ๋‚˜์™”๋‹ค. ๋•๋ถ„์— ์ •๋ง ๋งŽ์ด ๋ณด๊ณ  ๋ฐฐ์› ๊ณ , ์ด๋Ÿฐ ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ํ•  ์ˆ˜ ์žˆ์–ด ๋„ˆ๋ฌด ๊ฐ์‚ฌํ–ˆ๋‹ค.
 
์›๋ž˜ ์Šคํ„ฐ๋”” ๋ชจ์ง‘ ๋‹น์‹œ, 2์ฐจ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ๊ณต์‹์ ์œผ๋กœ 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘์ผ์ธ 5์›” 7์ผ ํ•˜๋ฃจ ์ „์ธ 5์›” 6์ผ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ์— ๊ด€ํ•œ Notion ๊ธ€๋งŒ ๋ด๋„, ๊ทธ ๋‚œ์ด๋„๋Š” 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ๋ณด๋‹ค ํ›จ์”ฌ ๋†’์•„ ๋ณด์˜€๊ณ , ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ํ•จ๊ป˜ ์ฐธ์—ฌํ•˜์‹  ํŒ€์›๋ถ„๋“ค ์—ญ์‹œ ๊ฐ์ž์˜ ํŒ€ ์‚ฌ์ •์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŒ€ ํ”„๋กœ์ ํŠธ ํ•˜๋ฃจ ์ „๋‚ ์€ ํŒ€ ์ค€๋น„์— ์ง‘์ค‘ํ•˜๊ธฐ๋กœ ํ•˜๊ณ  ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์˜ค๋Š˜๊นŒ์ง€๋กœ ์กฐ์œจํ–ˆ๋‹ค.
 
๋ฌผ๋ก  ํ•˜๋ฃจ๋งŒ ๋” ์—ฌ์œ ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด HTML ๋ฆฌํฌํŠธ ์—ฐ๋™, Jira ์ž๋™ ํ‹ฐ์ผ“ ์ƒ์„ฑ, Slack ์•Œ๋ฆผ ์ „์†ก๊นŒ์ง€ ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ๋‚˜ ์—ญ์‹œ ํ•˜๋ฃจ ์ „๋‚ ์€ 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ์ค€๋น„์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์•ž์œผ๋กœ ์˜ค์ „ 10์‹œ๋ถ€ํ„ฐ ์˜คํ›„ 11์‹œ๊นŒ์ง€ ์•ฝ 10์ผ๊ฐ„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง‘์ค‘์ ์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์•ฝ๊ฐ„์˜ ํœด์‹๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์ผ์–ด๋‚˜๋Š” ์‹œ๊ฐ„ ์กฐ์ ˆ์ด ์ œ์ผ ๊ฑฑ์ •๋˜๊ธด ํ•˜์ง€๋งŒ... ์•„๋ฌดํŠผ ์ดˆ๋ฐ˜์—๋Š” ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ผ ๊ฑฑ์ •์ด ๋งŽ์•˜์ง€๋งŒ, ํŒ€์›๋ถ„๋“ค ๋•๋ถ„์— ์ •๋ง ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋กœ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.


๐ŸŽฏ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ตœ์ข… ํšŒ๊ณ 

 

โฌ‡๏ธ GitHub ์ฃผ์†Œ

GitHub - kys0529/EliceQA_Side_Project

Contribute to kys0529/EliceQA_Side_Project development by creating an account on GitHub.

github.com

 

โœ… Appium์€ ์ƒ๊ฐ๋ณด๋‹ค Selenium๊ณผ ๋‹ฎ์•„์žˆ๋‹ค

์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋А๋‚€ ๊ฐ€์žฅ ํฐ ์ธ์‚ฌ์ดํŠธ๋Š” Appium์ด Selenium๊ณผ ์ •๋ง ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ๋ฌผ๋ก , ๊ธฐ๊ธฐ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ์„ค์ •์ด ๊นŒ๋‹ค๋กญ๊ณ , ๊ธฐ๊ธฐ๋ณ„ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ถ„๋ช…ํ•œ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ‚ค๋ณด๋“œ ์ฐฝ์ด ์—ด๋ฆด ๋•Œ ์š”์†Œ๊ฐ€ ๊ฐ€๋ ค์ง€๊ฑฐ๋‚˜ ๊ฐ€๋ ค์ง€์ง€ ์•Š๋Š” ๋ฌธ์ œ, ๋™์ผํ•œ ์š”์†Œ๋ผ๋„ ํ•ด์ƒ๋„๋‚˜ ์œ„์น˜๊ฐ€ ๊ธฐ๊ธฐ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” ํ˜„์ƒ, ๊ฐ ์ œ์กฐ์‚ฌ๋งˆ๋‹ค ๊ฐค๋Ÿฌ๋ฆฌ ๊ตฌ์กฐ๋‚˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค๋ฅธ ์  ๋“ฑ์€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์‹œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ ๋“ค์„ ์ œ์™ธํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ํ๋ฆ„ ์ž์ฒด๋Š” Selenium๊ณผ ๋งค์šฐ ์œ ์‚ฌํ–ˆ๊ณ , ๊ธฐ์กด์— ์ตํ˜”๋˜ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ•๋“ค์„ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ž์‹ ๊ฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

โœ… ๊ตฌ์กฐ์ ์œผ๋กœ ๋ฐœ์ „ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ „์ฒด์ ์ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋„ ๋” ์„ฑ์ˆ™ํ•˜๊ฒŒ ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • .env๋ฅผ ํ†ตํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ
  • capabilities ํŒŒ์ผ ๋ถ„๋ฆฌ๋กœ ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค ์„ค์ • ๋Œ€์‘
  • BasePage ํด๋ž˜์Šค ์ •๋ฆฝ๊ณผ ๊ณตํ†ต ๋™์ž‘ ํ•จ์ˆ˜ ์ถ”์ถœ
  • ๊ฐ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋งˆ๋‹ค driver๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋กœ๊ทธ์ธ๊นŒ์ง€ ์ž๋™ ์ฒ˜๋ฆฌ๋˜๋Š” fixture ๊ตฌ์„ฑ

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•๋ถ„์— ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ™•์‹คํžˆ ํ–ฅ์ƒ๋˜์—ˆ๊ณ , ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋„ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

โœ… ์‹œ๋‚˜๋ฆฌ์˜ค ๊ตฌ์„ฑ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์•„์‰ฌ์›€

์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” โ€˜์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑโ€™์„ ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค๋Š” ์ ์—์„œ ๋ถ„๋ช…ํžˆ ์˜๋ฏธ ์žˆ๋Š” ์ง„์ „์ด ์žˆ์—ˆ๋‹ค. ํŠนํžˆ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฒ„ํŠผ ํ•˜๋‚˜๋ฅผ ๋ˆ„๋ฅด๋Š” ๋‹จ์œ„๊นŒ์ง€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ์ž‘์„ฑํ–ˆ๊ณ , ์ˆ˜ํ–‰ ์ ˆ์ฐจ๋„ ๊ฑฐ์˜ ํ•œ ๋‹จ๊ณ„๋กœ ์ œํ•œ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์—ˆ๋‹ค. ๋ฐ˜๋ฉด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— 2~3๋‹จ๊ณ„์˜ ํ๋ฆ„์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๊ณ , โ€˜์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜คโ€™๋ผ๋Š” ๊ฐœ๋…์„ ๋ฌธ์„œ๋กœ ์ •๋ฆฌํ•˜๋ ค๋Š” ์‹œ๋„ ์ž์ฒด๋Š” ๋ถ„๋ช… ์ƒˆ๋กœ์› ๋‹ค.
 
ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์‹ค์ œ ๊ตฌํ˜„ ๋‹จ๊ณ„์—์„œ๋Š” ๋˜๋‹ค์‹œ โ€˜ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค = ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜โ€™๋ผ๋Š” ๊ตฌ์กฐ๋กœ ์ง„ํ–‰๋˜์—ˆ๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—ญ์‹œ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์ง„ ์ผ€์ด์Šค๋“ค์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์— ๋จธ๋ฌผ๋ €๋‹ค. โ€œ์ด ํ๋ฆ„์ด๋ผ๋ฉด ์˜คํžˆ๋ ค ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์‹œ๋‚˜๋ฆฌ์˜ค ํ๋ฆ„๋Œ€๋กœ ์ผ€์ด์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ์ง€ ์•Š์„๊นŒ?โ€ ํ•˜๋Š” ์˜๋ฌธ์ด ์ค‘๊ฐ„์— ๋“ค๊ธฐ๋„ ํ–ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜๋ถ€ํ„ฐ ์ •ํ•ด์ง„ ๋ฐฉํ–ฅ์ด ์žˆ์—ˆ๊ณ , ์ด๋ฏธ ์ „์ฒด ๊ตฌ์กฐ๊ฐ€ ๊ทธ ๋ฐฉ์‹์— ๋งž์ถฐ์ง€๊ณ  ์žˆ์—ˆ๊ธฐ์— ์ค‘๊ฐ„์— ๋ฐ”๊พธ๊ธฐ์—๋Š” ์กฐ์‹ฌ์Šค๋Ÿฌ์šด ๋ถ„์œ„๊ธฐ์˜€๋‹ค.
 
๋ฌด์—‡๋ณด๋‹ค๋„, ๊ฒ‰์œผ๋กœ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฌธ์„œํ™”ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๊ทธ๊ฒƒ์ด ๊ณง ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ™•์‹คํžˆ ๋А๊ผˆ๋‹ค. ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ TC๋“ค์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ํŒŒ์ƒ๋œ ๊ฒƒ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค์‹œ ์ชผ๊ฐœ๊ณ  ๋‚˜๋ˆˆ ๊ฒƒ์— ๊ฐ€๊นŒ์› ๊ณ , ๋‹ค์–‘ํ•œ ํ๋ฆ„์ด๋‚˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๊ฒฐ๊ตญ ๋˜๋‹ค์‹œ ๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋ถ„ํ•  ํ…Œ์ŠคํŠธ์— ๊ฐ€๊นŒ์› ๋‹ค.
 
์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ๋ถ„๋ช…ํžˆ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ๋ณด๋‹ค๋Š” ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ„ ์‹œ๋„์˜€๊ณ , '์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ'๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ํŒ€ ์ „์ฒด๊ฐ€ ์˜์‹ํ•˜๋ฉฐ ์›€์ง์ด๋ ค ํ–ˆ๋‹ค๋Š” ์ ์—์„œ ํฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ํ๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ ๊ตฌ์กฐ์— ๋ฐ˜์˜ํ•˜๊ฑฐ๋‚˜, ์‹œ๋‚˜๋ฆฌ์˜ค ๋‹จ์œ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ์—๋Š” ๋ถ€์กฑํ•จ์ด ์žˆ์—ˆ๋‹ค.
 
๊ทธ๋ž˜์„œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ดˆ๊ธฐ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ํ๋ฆ„ ์ค‘์‹ฌ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ TC๋ฅผ ๋„์ถœํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๊ทธ ํ๋ฆ„์— ๋งž์ถฐ ์„ค๊ณ„ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค. ๋‹จ์ˆœํžˆ โ€˜์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฌธ์„œํ™”ํ–ˆ๋‹คโ€™์—์„œ ๊ทธ์น˜์ง€ ์•Š๊ณ , ์ง„์งœ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘์‹ฌ์˜ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋ฅผ ํ•ด๋ณด๋Š” ๊ฒฝํ—˜์„ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.
 

โœ… ์˜จ๋ผ์ธ ํ™˜๊ฒฝ์—์„œ๋„ ๋น›๋‚œ ํŒ€์›Œํฌ์™€ ๊ธฐ๋ณธ ๊ตฌ์กฐ์˜ ์ค‘์š”์„ฑ

์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์ „๋ฉด ์˜จ๋ผ์ธ์œผ๋กœ ์ง„ํ–‰๋˜์–ด ์ฒ˜์Œ์—๋Š” ์†Œํ†ต๊ณผ ํ˜‘์—…์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์ปธ๋‹ค. ์ด์ „ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋งŒ๋‚˜ ์ง์ ‘ ๋…ธํŠธ๋ถ์„ ๋ณด๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜, ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜จ๋ผ์ธ ํ™˜๊ฒฝ์—์„œ์˜ ํ˜‘์—…์ด ๊ณผ์—ฐ ์ž˜ ๋  ์ˆ˜ ์žˆ์„์ง€ ๊ฑฑ์ •์ด ๋˜์—ˆ๋‹ค.
 
ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ๊ฑฑ์ •์ด ๋ฌด์ƒ‰ํ•  ์ •๋„๋กœ ํŒ€์› ๋ถ„๋“ค ๋ชจ๋‘๊ฐ€ ์ •๋ง ๋น ๋ฅด๊ณ  ์„ฑ์‹คํ•˜๊ฒŒ ์†Œํ†ตํ•ด์ฃผ์…จ๋‹ค. ํ”ผ๋“œ๋ฐฑ์€ ์‹ ์†ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ด์—ˆ๊ณ , ์ž๋ฃŒ ์ •๋ฆฌ, ๋ฌธ์„œ ๊ณต์œ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ์˜์‚ฌ์†Œํ†ต๊นŒ์ง€ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ์ฒด๊ณ„์ ์ด๊ณ  ๊น”๋”ํ•œ ํ˜‘์—…์ด ์ด๋ฃจ์–ด์กŒ๋‹ค. ์˜คํžˆ๋ ค ๋‚ด๊ฐ€ ๋” ๋ฐ˜์„ฑํ•˜๊ณ  ๋ฐฐ์›Œ์•ผ ํ•  ๋ถ€๋ถ„์ด ๋งŽ๋‹ค๊ณ  ๋А๊ปด์งˆ ์ •๋„์˜€๋‹ค.
 
ํŠนํžˆ ์˜จ๋ผ์ธ ํ™˜๊ฒฝ์ผ์ˆ˜๋ก ๊ธฐ๋ณธ ํ‹€์˜ ์ค‘์š”์„ฑ์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๊ผˆ๋‹ค. ์˜คํ”„๋ผ์ธ๋ณด๋‹ค ์ž‘์—… ๋งฅ๋ฝ์„ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ๋น„์šฉ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๋ฐ˜์— ํŒ€ ์ „์ฒด๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ๋ฅผ ์ •ํ•ด๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ๋‹จ๊ณ„์—์„œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ, ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ๋„ค์ด๋ฐ ๊ทœ์น™, ๊ณตํ†ต ํ•จ์ˆ˜ ์ •์˜ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ์ค€์„ ํ•จ๊ป˜ ๋…ผ์˜ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋’ค ๋ณธ๊ฒฉ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์— ๋“ค์–ด๊ฐ”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, BasePage์— ๊ณตํ†ต ๋™์ž‘ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ๋„ ๋‹จ์ˆœํžˆ ๋ณธ์ธ์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, โ€œ์ด๊ฑฐ ๋‹ค๋ฅธ ๋ถ„๋“ค๋„ ์ž์ฃผ ์“ฐ์‹ค ๊ฒƒ ๊ฐ™์€๋ฐ ๊ฐ™์ด ์จ์š”!โ€ ๊ฐ™์€ ์ œ์•ˆ์„ ํ•˜๋ฉฐ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ–ˆ๊ณ , ์ด๋Ÿฐ ํ๋ฆ„์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ˜‘์—…์˜ ์‹œ๋„ˆ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
 
์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด, ์˜จ๋ผ์ธ ํ™˜๊ฒฝ์—์„œ๋„ ์–ผ๋งˆ๋“ ์ง€ ์œ ๊ธฐ์ ์ธ ํ˜‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ๊ณผ, ๊ทธ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ์ดˆ๊ธฐ ๊ตฌ์กฐ ์„ค๊ณ„์™€ ํŒ€์› ๊ฐ„์˜ ์ ๊ทน์ ์ธ ์†Œํ†ต์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋‹ค์‹œ๊ธˆ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

โœ… ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜ Slack & Jira ์—ฐ๋™

๊ฐœ์ธ์ ์œผ๋กœ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ผญ ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š”

  • ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ์ž๋™ ํ‹ฐ์ผ“ ์ƒ์„ฑ(Jira)
  • Slack ์—ฐ๋™์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „์†ก์ด์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ์ค€๋น„์™€ ๋ณ‘ํ–‰ํ•˜๋Š” ์ผ์ • ํƒ“์— ๋๋‚ด ์‹œ๋„ํ•ด๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ์•„์‰ฌ์›€์ด ํฌ์ง€๋งŒ, ๋‹ค์Œ ๊ธฐํšŒ์— ๊ผญ ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ์€ ๋ชฉํ‘œ๋กœ ๋‚จ๊ฒจ๋‘์—ˆ๋‹ค.
 

โœ… ์ •๋ฆฌํ•˜๋ฉฐ

์ด๋ฒˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ๋„, ํ˜‘์—…์ ์œผ๋กœ๋„ ์˜๋ฏธ ์žˆ๋Š” ๋„์ „์ด์—ˆ๋‹ค.

  • Appium ๊ธฐ๋ฐ˜์˜ ๋ชจ๋ฐ”์ผ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ฒฝํ—˜
  • ํšจ์œจ์ ์ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์„ค๊ณ„
  • ์˜จ๋ผ์ธ ํ˜‘์—…์˜ ์žฅ์ ๊ณผ ๊ฐ€๋Šฅ์„ฑ ์ฒด๊ฐ
  • ํ…Œ์ŠคํŠธ ์ „๋žต์— ๋Œ€ํ•œ ๊นŠ์€ ๊ณ ๋ฏผ

์งง์€ ๊ธฐ๊ฐ„์ด์—ˆ์ง€๋งŒ ๊ทธ ์†์—์„œ ํ™•์‹คํ•œ ์„ฑ์žฅ์„ ์ฒด๊ฐํ–ˆ๊ณ , ์•ž์œผ๋กœ ๋‚ด๊ฐ€ QA๋กœ์„œ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ๋” ๋ฐœ์ „ํ•ด๊ฐ€์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€๋„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ํŒ€์›๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ, ์ด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ์ข‹์€ QA๊ฐ€ ๋˜์–ด๊ฐ€๊ณ  ์‹ถ๋‹ค.
 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“‚ Quality Assurance Study > ๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 15~16์ฃผ์ฐจ] 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ   (0) 2025.05.16
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 1์ฐจ ์Šคํ„ฐ๋””] ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (2/10~3/14)  (3) 2025.05.05
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 14์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (๊ณ ๊ธ‰ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)  (0) 2025.05.02
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 13์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์™€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ)  (0) 2025.04.24
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 12์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (API ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)  (0) 2025.04.17
'๐Ÿ“‚ Quality Assurance Study/๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 15~16์ฃผ์ฐจ] 2์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 1์ฐจ ์Šคํ„ฐ๋””] ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (2/10~3/14)
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 14์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (๊ณ ๊ธ‰ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”)
  • [์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 13์ฃผ์ฐจ] ํ•™์Šต ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ  (์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์™€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ)
YeonSu02
YeonSu02
Email : rkddustn2519@naver.com
  • YeonSu02
    IsLiife2
    YeonSu02
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐Ÿ“‚ Computer Science
      • ๐Ÿ“‚ Unity Engine Study
        • ๐Ÿ“„ Unity ์ธํ”„๋Ÿฐ ๊ฐ•์˜
        • ๐Ÿ“„ Unity ์œ ํŠœ๋ธŒ ๊ฐ•์˜
        • ๐Ÿ“„ Unity ์ฐธ๊ณ 
      • ๐Ÿ“‚ Game Designer Study
        • ๐Ÿ“„ ๊ธฐํš ์ธํ”„๋Ÿฐ ๊ฐ•์˜
      • ๐Ÿ“‚ Quality Assurance Study N
        • ๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™ N
        • ๐Ÿ“„ QA ๊ณต๋ถ€
        • ๐Ÿ“š QA ์ฑ… ๋ฆฌ๋ทฐ
      • ๐Ÿ“‚ Program Language Study
        • ๐Ÿ“„ C# ๊ณต๋ถ€
        • ๐Ÿ“„ ํŒŒ์ด์ฌ ๊ณต๋ถ€
        • ๐Ÿ“„ Java ๊ณต๋ถ€
        • ๐Ÿ“„ JavaScript ๊ณต๋ถ€
      • ๐Ÿ“‚ Additional Study
        • ๐Ÿ“„ Git
        • ๐Ÿ“„ Firebase
        • ๐Ÿ“„ License
      • ๐Ÿ’ป Game Development
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
  • ๋งํฌ

    • GitHub
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์—‘์…€
    ์ปดํ“จํ„ฐํ™œ์šฉ๋Šฅ๋ ฅ1๊ธ‰
    ์ •์ฒ˜๊ธฐ ๋…ํ•™
    ์ •์ฒ˜๊ธฐ ํ•„๊ธฐ
    ISTQB
    ๊ตญ์ œ์ž๊ฒฉ์ฆ
    ์ปดํ™œ
    istqb-ctfl
    qa์ž๊ฒฉ์ฆ
    qa ์ฑ… ๋ฆฌ๋ทฐ
    QA
    ์ž๊ฒฉ์ฆ
    ์ปดํ“จํ„ฐํ™œ์šฉ๋Šฅ๋ ฅ
    ์ •์ฒ˜๊ธฐ
    ์ปดํ™œ2๊ธ‰
    ์ปดํ“จํ„ฐํ™œ์šฉ๋Šฅ๋ ฅ2๊ธ‰
    qa ์ฑ…
    ์ •์ฒ˜๊ธฐ ์‹ค๊ธฐ
    BTS
    ํ…Œ์ŠคํŒ…์ž๊ฒฉ์ฆ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
YeonSu02
[์—˜๋ฆฌ์Šค SW QA ํŠธ๋ž™ 2์ฐจ ์Šคํ„ฐ๋””] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  (4/18~5/5)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”