-
Quick - Behavior Driven DevelopmentLibrary 2025. 4. 5. 08:42
안녕하세요. 그린입니다 🍏
이번 포스팅에서는 iOS에서 외부 테스트 프레임워크인 Quick에 대해 알아보겠습니다 🙋🏻
그리고 부제로 Behavior Driven Development라고 작성해놨는데요.
BDD에요. 즉, 이러한 스타일로 Quick을 이용해 테스트를 작성할 수 있도록 해줍니다.
XCTest보다 더 가독성이 좋고 구조적인 테스트 코드를 작성할 수 있도록 도와주죠!
또한, 이번 포스팅에서는 소개되지 않았지만, 이어 속편으로 Nimble이라는 라이브러리도 같이 소개해볼거에요.
Nimble과 함께 사용되는것이 테스트 코드를 짜는데 더 편리하고 합이 좋아요 🙂그럼 본격적으로 Quick을 알아볼까요?
Quick?
Quick은 BDD 스타일의 테스트 프레임워크로, 테스트 시나리오를 명확히 선언하고 작성할 수 있게 해주죠.
Swift와 Objective-C를 지원하고 애플의 XCTest 기반 위에서 작동해요.
Quick의 장점으로는 대표적으로 다음과 같은것들이 있습니다.
1️⃣ BDD 스타일의 높은 가독성
2️⃣ 중첩 가능 구조 (describe / context)
3️⃣ 세팅, 해제 등 로직의 명확한 분리 (beforeEach / afterEach)
4️⃣ Nimble과 합이 좋아 테스트 코드에서 더 풍부한 표현
여기서 Nimble과 어떤 합이 좋은지 구조적으로 살펴볼께요.
import Quick import Nimble class HelloSpec: QuickSpec { override func spec() { describe("Hello") { context("when greeted") { it("returns correct message") { let greeting = "Hello, Quick!" expect(greeting).to(equal("Hello, Quick!")) } } } } }
물론, Quick만 써도 되지만, 일반적으로 Nimble 라이브러리와 함께 사용됩니다.
이렇게 코드처럼 Nimble에서 expect, to와 같은 직관적인 구문을 제공해주죠.
그럼 이제 Quick의 컴포넌트들을 소개해볼께요!
Quick Component
describe / context / it
describe("LoginViewModel") { context("when login is successful") { it("should set isLoggedIn to true") { // 테스트 구현 } } }
describe는 테스트 대상인 모듈, 클래스, 함수 등에 대한 설명을 해줍니다.
context는 특정 상황이나 조건을 기술해주죠.
it은 실제 테스트 케이스를 나타내요.
일반적으로 우리가 테스트를 통해 기대하는것에 대해 기술하는 편이죠.
beforeEach / afterEach
beforeEach { viewModel = LoginViewModel() } afterEach { viewModel = nil }
두가지를 활용한다면 테스트 실행 전/후로 공통적인 세팅이나 해제 등 작업에 사용할 수 있어요.
그럼 이 Quick을 이용해 실제 예제 코드를 작성해볼까요?
Quick implementation
MVVM에서 뷰모델이 있다고 가정하고 테스트를 해볼까해요.
class LoginViewModel { var isLoggedIn: Bool = false func login(id: String, password: String) { if id == "admin" && password == "1234" { isLoggedIn = true } } }
이런 간단한 로그인에 대한 뷰모델이 있습니다.
import Quick import Nimble class LoginViewModelSpec: QuickSpec { override func spec() { var viewModel: LoginViewModel! beforeEach { viewModel = LoginViewModel() } describe("LoginViewModel") { context("when correct credentials are entered") { it("sets isLoggedIn to true") { viewModel.login(id: "admin", password: "1234") expect(viewModel.isLoggedIn).to(beTrue()) } } context("when incorrect credentials are entered") { it("keeps isLoggedIn as false") { viewModel.login(id: "user", password: "wrong") expect(viewModel.isLoggedIn).to(beFalse()) } } } } }
그럼 이런식으로 Quick과 Nimble을 활용해 사용자 흐름처럼 BDD 방식으로 쉽게 테스트 코드를 작성할 수 있죠.
만약 테스트 대상이 비동기 로직일 경우에는 아래와 같이 waitUntil을 사용하는것도 방법이 됩니다.
it("calls completion after delay") { waitUntil(timeout: .seconds(2)) { done in someAsyncFunction { expect(result).to(equal("Success")) done() } } }
ViewModel 테스트 시에 인풋과 아웃풋 구조를 가진 경우에 이런 테스트 방식이 아주 적절해요.
그럼 이런 Quick을 언제 사용하면 좋을까요?
1️⃣ 복잡한 단위 테스트
2️⃣ 테스트 가독성 높이기
이런 부분에 있어서 Quick을 사용하는것이 아주 유용할거에요.
그런데, 이런 장점을 가져가지 않아도 된다하거나 기존 XCTest로도 충분하다면 적합하지 않습니다.
그리고 또 UITest에는 적합하지 않아요.
Conclusion
결국 이 Quick의 핵심은 BDD 스타일로 테스트를 조직화하고, Nimble과 함께 선언적으로 테스트 코드를 작성하는데 도움을 줍니다.
그렇다면 유지보수와 가독성적인 생산적인 측면에서 많은 이점을 가져갈거에요.
Quick과 함께 TDD의 시작을 걸어보는건 어떨까요?
Reference
GitHub - Quick/Quick: The Swift (and Objective-C) testing framework.
The Swift (and Objective-C) testing framework. Contribute to Quick/Quick development by creating an account on GitHub.
github.com
'Library' 카테고리의 다른 글
Nimble - Behavior Driven Development (0) 2025.04.12 YouTubePlayerKit을 활용한 쇼츠 구현하기 (91) 2024.08.01 Firebase - Remote Config (67) 2024.03.11 Get 라이브러리로 심플한 웹 API 클라이언트 구현하기 (4) 2023.02.13 PopupView (6) 2023.02.06