ฉันชื่อมิทรี ฉันทำงานเป็นผู้ทดสอบในบริษัทแห่งหนึ่ง
ก่อนหน้านั้น ฉันลองใช้ Firebase Test Lab สำหรับ Android แล้ว และฉันชอบทุกอย่างมาก ดังนั้นฉันจึงตัดสินใจลองวางโครงสร้างพื้นฐานการทดสอบ iOS ของโปรเจ็กต์ไว้บนรางเดียวกัน ฉันต้องใช้ Google มากมายและไม่ใช่ว่าทุกอย่างจะได้ผลในครั้งแรก ดังนั้นฉันจึงตัดสินใจเขียนบทความแนะนำสำหรับผู้ที่ยังต้องทำอยู่
ดังนั้น หากคุณมีการทดสอบ UI บนโปรเจ็กต์ iOS คุณสามารถลองรันการทดสอบบนอุปกรณ์จริงได้แล้ววันนี้ โดยได้รับความกรุณาจาก Good Corporation สนใจ-ยินดีต้อนรับภายใต้แมว.
ในเรื่องราวนี้ ฉันตัดสินใจสร้างจากแหล่งข้อมูลบางส่วน ซึ่งเป็นพื้นที่เก็บข้อมูลส่วนตัวบน GitHub และระบบการสร้าง CircleCI ชื่อแอปพลิเคชันคือ AmazingApp, BundleID คือ com.company.amazingapp ฉันอ้างอิงข้อมูลเหล่านี้ทันทีเพื่อลดความสับสนในภายหลัง
หากคุณใช้โซลูชันบางอย่างในโครงการของคุณแตกต่างออกไป แบ่งปันประสบการณ์ของคุณในความคิดเห็น
1. การทดสอบด้วยตนเอง
สร้างสาขาโครงการใหม่สำหรับการทดสอบ UI:
$ git checkout develop
$ git pull
$ git checkout -b “feature/add-ui-tests”
มาเปิดโปรเจ็กต์ใน XCode และสร้างเป้าหมายใหม่ด้วยการทดสอบ UI [XCode -> ไฟล์ -> ใหม่ -> เป้าหมาย -> ชุดการทดสอบ iOS] ตั้งชื่อให้ AmazingAppUITests
ไปที่ส่วน Build Phases ของ Target ที่สร้างขึ้น และตรวจสอบ Target Dependencies - AmazingApp ใน Compile Sources - AmazingAppUITests.swift
แนวทางปฏิบัติที่ดีในการแยกตัวเลือกบิลด์ต่างๆ ออกเป็นโครงร่างที่แยกจากกัน เราสร้างโครงร่างสำหรับการทดสอบ UI ของเรา [XCode -> Product -> Scheme -> New Scheme] และตั้งชื่อเดียวกันว่า AmazingAppUITests
โครงสร้างโครงร่างที่สร้างขึ้นควรรวมเป้าหมายของแอปพลิเคชันหลัก - การทดสอบ AmazingApp และ Target UI - AmazingAppUITests - ดูภาพหน้าจอ
ต่อไป เราจะสร้างการกำหนดค่าบิลด์ใหม่สำหรับการทดสอบ UI ใน Xcode คลิกที่ไฟล์โครงการ ไปที่ส่วนข้อมูล คลิกที่ “+” และสร้างการกำหนดค่าใหม่ เช่น XCtest เราจะต้องการสิ่งนี้ในอนาคตเพื่อหลีกเลี่ยงการเต้นรำกับแทมบูรีนเมื่อต้องลงนามโค้ด
มีเป้าหมายอย่างน้อยสามประการในโครงการของคุณ: แอปพลิเคชันหลัก การทดสอบหน่วย (มีบางส่วนใช่ไหม) และ UI เป้าหมายของการทดสอบที่เราสร้างขึ้น
ไปที่ Target AmazingApp, แท็บการตั้งค่า Build, ส่วน Code Signing Identity สำหรับการกำหนดค่า XCtest ให้เลือก iOS Developer ในส่วนสไตล์การลงนามโค้ด ให้เลือกด้วยตนเอง เรายังไม่ได้สร้างโปรไฟล์การจัดสรร แต่เราจะกลับมาที่โปรไฟล์นี้ในภายหลังอย่างแน่นอน
สำหรับ Target AmazingAppUITests เราก็ทำเช่นเดียวกัน แต่ป้อน com.company.amazingappuitests ในคอลัมน์ Product Bundle Identifier
2. การจัดทำโปรเจ็กต์ใน Apple Developer Program
ไปที่หน้าโปรแกรมนักพัฒนาของ Apple ไปที่ส่วนใบรับรอง ตัวระบุ และโปรไฟล์ จากนั้นไปที่คอลัมน์รหัสแอปของรายการตัวระบุ สร้าง App ID ใหม่ชื่อ AmazingAppUITests และ BundleID com.company.amazingappuitests
ตอนนี้เรามีโอกาสที่จะลงนามการทดสอบของเราด้วยใบรับรองแยกต่างหาก แต่ ... ขั้นตอนการสร้างสำหรับการทดสอบเกี่ยวข้องกับการสร้างแอปพลิเคชันเองและการสร้างตัวดำเนินการทดสอบ ดังนั้นเราจึงประสบปัญหาในการลงนาม ID บันเดิลสองชุดด้วยโปรไฟล์การจัดเตรียมเดียว โชคดีที่มีวิธีแก้ไขที่เรียบง่ายและสวยงาม - Wildcard App ID เราทำซ้ำขั้นตอนในการสร้าง App ID ใหม่ แต่แทนที่จะใช้ ID แอปที่ชัดเจน ให้เลือก Wildcard App ID ดังในภาพหน้าจอ
ณ จุดนี้ เราดำเนินการกับ Developer.apple.com เสร็จแล้ว แต่เราจะไม่ย่อขนาดหน้าต่างเบราว์เซอร์ ไปกันเถอะ
ผู้อ่านที่สนใจได้สังเกตเห็นว่าในการใช้ยูทิลิตี้นี้ เราจำเป็นต้องมีพื้นที่เก็บข้อมูลส่วนตัวและบัญชีที่สามารถเข้าถึงทั้งโปรแกรมนักพัฒนา Apple และ Github เราสร้างบัญชีของแบบฟอร์ม (หากจู่ๆ ก็ไม่มีสิ่งนั้น) [ป้องกันอีเมล]ตั้งรหัสผ่านที่รัดกุม ลงทะเบียนที่ Developer.apple.com และแต่งตั้งให้เป็นผู้ดูแลโครงการ จากนั้น ให้สิทธิ์บัญชีของคุณในการเข้าถึงพื้นที่เก็บข้อมูล GitHub ของบริษัทของคุณ และสร้างพื้นที่เก็บข้อมูลส่วนตัวใหม่ที่มีชื่อเช่น AmazingAppMatch
3. การตั้งค่า Fastlane และยูทิลิตี้การจับคู่
เปิดเทอร์มินัล ไปที่โฟลเดอร์ที่มีโปรเจ็กต์และเริ่มต้น Fastlane ตามที่ระบุไว้ใน
$ fastlane init
คุณจะได้รับแจ้งให้เลือกการกำหนดค่าการใช้งานที่มีอยู่ เราเลือกรายการที่สี่ - การกำหนดค่าด้วยตนเองของโครงการ
ไดเร็กทอรี fastlane ใหม่ปรากฏในโปรเจ็กต์ ซึ่งมีสองไฟล์ - Appfile และ Fastfile โดยสรุป - ใน Appfile เราจัดเก็บข้อมูลบริการ และใน Fastfile เราเขียนงานในคำศัพท์ Fastlane ที่เรียกว่า lanes ฉันแนะนำให้อ่านเอกสารอย่างเป็นทางการ:
เปิด Appfile ในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบแล้วนำมาไว้ในแบบฟอร์มต่อไปนี้:
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "[email protected]" # Созданный инфраструктурный аккаунт, имеющий право на редактирование iOS проекта в Apple Developer Program.
team_id "LSDY3IFJAY9" # Your Developer Portal Team ID
เรากลับไปที่เทอร์มินัลและเริ่มตั้งค่าการจับคู่ตามคู่มืออย่างเป็นทางการ
$ fastlane match init
$ fastlane match development
จากนั้นป้อนข้อมูลที่ต้องการ - พื้นที่เก็บข้อมูล บัญชี รหัสผ่าน ฯลฯ
สำคัญ: ครั้งแรกที่คุณเรียกใช้ยูทิลิตี้การจับคู่ ระบบจะขอให้คุณป้อนรหัสผ่านเพื่อถอดรหัสที่เก็บ การบันทึกรหัสผ่านนี้เป็นสิ่งสำคัญมาก เราจะต้องใช้ในขั้นตอนการตั้งค่าเซิร์ฟเวอร์ CI!
ไฟล์ใหม่ปรากฏในโฟลเดอร์ fastlane - Matchfile เปิดในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบแล้วนำมาไว้ในแบบฟอร์ม:
git_url("https://github.com/YourCompany/AmazingAppMatch") #Созданный приватный репозиторий для хранения сертификатов и профайлов.
type("development") # The default type, can be: appstore, adhoc, enterprise or development
app_identifier("com.company.amazingapp")
username("[email protected]") # Your Infrastructure account Apple Developer Portal username
เรากรอกข้อมูลด้วยวิธีนี้หากเราต้องการใช้การจับคู่ในอนาคตเพื่อลงนามบิวด์สำหรับการอัปโหลดไปยัง Crashlytics และ/หรือ AppStore เช่น เพื่อลงนาม ID ชุดรวมของแอปพลิเคชันของคุณ
แต่อย่างที่เราจำได้ เราได้สร้าง Wildcard ID พิเศษเพื่อลงนามในรุ่นทดสอบ ดังนั้นให้เปิด Fastfile แล้วเข้าสู่ช่องทางใหม่:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
)
end
บันทึกเข้าสู่เทอร์มินัล
fastlane testing_build_for_firebase
และดูว่า fastlane สร้างใบรับรองใหม่และวางไว้ในพื้นที่เก็บข้อมูลได้อย่างไร ยอดเยี่ยม!
เปิด XCode ตอนนี้เรามีโปรไฟล์การจัดเตรียมที่จำเป็นของประเภท Match Development com.company.* ซึ่งจะต้องระบุในส่วนโปรไฟล์การจัดเตรียมสำหรับเป้าหมาย AmazingApp และ AmazingAppUITests
ยังคงต้องเพิ่มช่องทางเพื่อสร้างการทดสอบ ไปกันเถอะ
คัดลอกและวางจากตัวอย่างดั้งเดิมเพื่อให้เลนการทดสอบ_build_for_firebaseของเรากลายเป็นดังนี้:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests"
)
scan(
scheme: 'AmazingAppUITests', # UI Test scheme
clean: true, # Recommended: This would ensure the build would not include unnecessary files
skip_detect_devices: true, # Required
build_for_testing: true, # Required
sdk: 'iphoneos', # Required
should_zip_build_products: true, # Must be true to set the correct format for Firebase Test Lab
)
firebase_test_lab_ios_xctest(
gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (к этой строчке вернемся позже)
devices: [ # Device(s) to run tests on
{
ios_model_id: 'iphonex', # Device model ID, see gcloud command above
ios_version_id: '12.0', # iOS version ID, see gcloud command above
locale: 'en_US', # Optional: default to en_US if not set
orientation: 'portrait' # Optional: default to portrait if not set
}
]
)
end
สำหรับข้อมูลทั้งหมดเกี่ยวกับการตั้งค่าช่องทางด่วนใน CircleCI ฉันแนะนำให้อ่านเอกสารอย่างเป็นทางการ
อย่าลืมเพิ่มงานใหม่ให้กับ config.yml ของเรา:
build-for-firebase-test-lab:
macos:
xcode: "10.1.0"
working_directory: ~/project
shell: /bin/bash --login -o pipefail
steps:
- checkout
- attach_workspace:
at: ~/project
- run: sudo bundle install # обновляем зависимости
- run:
name: install gcloud-sdk # на mac машину необходимо установить gcloud
command: |
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null
brew cask install google-cloud-sdk
- run:
name: build app for testing
command: fastlane testing_build_for_firebase # запускаем lane сборки и отправки в firebase
4. แล้วแท่นทดสอบของเราล่ะ? กำลังตั้งค่า Firebase
มาดูกันว่าบทความนี้เขียนขึ้นเพื่ออะไร
แอปของคุณอาจใช้ Firebase ในแผนบริการฟรี หรืออาจไม่ได้ใช้ Firebase เลย ไม่มีความแตกต่างพื้นฐานอย่างแน่นอน เพราะสำหรับความต้องการในการทดสอบ เราสามารถสร้างโปรเจ็กต์แยกต่างหากพร้อมการใช้งานฟรีหนึ่งปี (เจ๋งใช่มั้ย)
เราเข้าสู่บัญชีโครงสร้างพื้นฐานของเรา (หรืออื่น ๆ ไม่สำคัญ) และไปที่
สำคัญ: ในขั้นตอนก่อนหน้า ใน Fastfile ในเลน firebase_test_lab_ios_xctest พารามิเตอร์ gcp_project จะต้องตรงกับชื่อของโปรเจ็กต์
การตั้งค่าเริ่มต้นเหมาะกับเราพอสมควร
เราไม่ปิดแท็บ เราลงทะเบียนภายใต้บัญชีเดียวกันค่ะ
Google แจกเงิน $300 ต่อปี ซึ่งในบริบทของการทดสอบอัตโนมัติจะเทียบเท่ากับการใช้บริการฟรีหนึ่งปี เราป้อนข้อมูลการชำระเงิน รอการตัดเงินทดสอบ $1 และรับ $300 เข้าบัญชี หลังจากผ่านไปหนึ่งปี โครงการจะถูกโอนไปยังแผนภาษีฟรีโดยอัตโนมัติ ดังนั้นคุณจึงไม่ต้องกังวลกับการสูญเสียเงินที่อาจเกิดขึ้น
กลับไปที่แท็บที่มีโปรเจ็กต์ Firebase แล้วโอนไปยังแผนภาษี Blaze - ตอนนี้เรามีบางอย่างที่ต้องจ่ายหากเกินขีดจำกัด
ในอินเทอร์เฟซ gcloud ให้เลือกโปรเจ็กต์ Firebase ของเรา เลือกรายการเมนูหลัก "แคตตาล็อก" และเพิ่ม Cloud Testing API และ Cloud Tools Result API
จากนั้นไปที่รายการเมนู "IAM และการดูแลระบบ" -> บัญชีบริการ -> สร้างบัญชีบริการ ให้สิทธิ์ในการแก้ไขโครงการ
สร้างคีย์ API ในรูปแบบ JSON
เราจะต้องดาวน์โหลด JSON ในภายหลังเล็กน้อย แต่สำหรับตอนนี้ เราจะถือว่าการตั้งค่า Test Lab เสร็จสมบูรณ์
5. การตั้งค่า CircleCI
คำถามที่สมเหตุสมผลคือการต้มเบียร์ - จะทำอย่างไรกับรหัสผ่าน? เพื่อรักษารหัสผ่านและข้อมูลที่ละเอียดอ่อนอื่นๆ ของเราให้ปลอดภัย กลไกของตัวแปรสภาพแวดล้อมของเครื่องบิลด์ของเราจะช่วยเรา ในการตั้งค่าโปรเจ็กต์ CircleCI ให้เลือกตัวแปรสภาพแวดล้อม
และตั้งค่าตัวแปรดังต่อไปนี้:
- คีย์: GOOGLE_APPLICATION_CREDENTIALS
ค่า: เนื้อหาของไฟล์ json คีย์บัญชีบริการ gcloud - คีย์: MATCH_PASSWORD
ค่า: รหัสผ่านเพื่อถอดรหัสที่เก็บ GitHub ด้วยใบรับรอง - คีย์: FASTLANE_PASSWORD
ค่า: รหัสผ่านบัญชีโครงสร้างพื้นฐานของพอร์ทัลนักพัฒนา Apple
เราบันทึกการเปลี่ยนแปลง สร้าง PR และส่งให้หัวหน้าทีมของเราตรวจสอบ
ผลของการ
จากการปรับเปลี่ยนง่าย ๆ เหล่านี้ เราจึงมีจุดยืนการทำงานที่ดีและมั่นคง พร้อมความสามารถในการบันทึกวิดีโอบนหน้าจออุปกรณ์ในขณะที่ทำการทดสอบ ในกรณีทดสอบ ฉันระบุรุ่นอุปกรณ์ iPhone X แต่ฟาร์มมีตัวเลือกมากมายจากการผสมผสานระหว่างรุ่นต่างๆ และเวอร์ชัน iOS
ส่วนที่สองจะเน้นไปที่การตั้งค่า Firebase Test Lab สำหรับโปรเจ็กต์ Android ทีละขั้นตอน
ที่มา: will.com