๐ ์คํฐ๋ ๋ชฉํ

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๊ฐ ๋์ด๊ฐ๊ณ ์ถ๋ค.