제2장: 데이터 기반 테스트
이 장에서는 서로 다른 테스트 데이터를 사용하여 테스트를 여러 번 실행하는 방법을 보여줍니다.
지금까지는 테스트하려는 데이터를 테스트 함수에 하드코딩해 왔습니다. 테스트 데이터를 더 추가하면 함수는 다음과 같이 보일 수 있습니다:
QCOMPARE(QString("hello").toUpper(), QString("HELLO"));
QCOMPARE(QString("Hello").toUpper(), QString("HELLO"));
QCOMPARE(QString("HellO").toUpper(), QString("HELLO"));
QCOMPARE(QString("HELLO").toUpper(), QString("HELLO"));함수가 반복적인 코드로 복잡해지는 것을 방지하기 위해, Qt Test 는 테스트 함수에 테스트 데이터를 추가하는 기능을 지원합니다. 테스트 클래스에 또 다른 비공개 슬롯을 추가하기만 하면 됩니다:
class TestQString: public QObject
{
Q_OBJECT
private slots:
void toUpper_data();
void toUpper();
};데이터 함수 작성
테스트 함수와 연관된 데이터 함수의 이름 뒤에는 _data 가 붙습니다. 데이터 함수는 다음과 같습니다:
void TestQString::toUpper_data()
{
QTest::addColumn<QString>("string");
QTest::addColumn<QString>("result");
QTest::newRow("all-lower") << "hello" << "HELLO";
QTest::newRow("mixed") << "Hello" << "HELLO";
QTest::newRow("all-upper") << "HELLO" << "HELLO";
}먼저, ` QTest::addColumn()` 함수를 사용하여 테스트 테이블의 두 요소를 정의합니다. 하나는 테스트 문자열이고, 다른 하나는 해당 문자열에 ` QString::toUpper()` 함수를 적용했을 때 예상되는 결과입니다.
그런 다음, ` QTest::newRow()` 함수를 사용하여 테이블에 데이터를 추가합니다. 예를 들어, 반복적으로 많은 데이터 행을 생성할 때와 같이 행 이름의 데이터를 포맷팅해야 하는 경우 ` QTest::addRow()` 함수를 사용할 수도 있습니다. 각 데이터 행은 테스트 테이블에서 별도의 행이 됩니다.
QTest::newRow() 함수는 하나의 인자를 받습니다. 이 인자는 데이터 세트와 연관되어 테스트 로그에서 데이터 행을 식별하는 데 사용되는 이름입니다. QTest::addRow() 함수는 (printf 스타일의) 포맷 문자열을 받으며, 그 뒤에는 포맷 문자열 내의 서식 지정 토큰 대신 표시될 매개변수가 이어집니다. 그런 다음 데이터 세트를 새 테이블 행으로 스트리밍합니다. 먼저 임의의 문자열을 입력하고, 그 다음 해당 문자열에 QString::toUpper() 함수를 적용했을 때 예상되는 결과를 입력합니다.
테스트 데이터를 2차원 테이블로 생각할 수 있습니다. 이 예제에서는 ‘ string ’와 ‘ result ’라는 두 개의 열과 세 개의 행으로 구성되어 있습니다. 또한 각 행에는 이름과 인덱스가 할당되어 있습니다:
| index | 이름 | 문자열 | 결과 |
|---|---|---|---|
| 0 | 모두 소문자 | "hello" | HELLO |
| 1 | 혼합 | "Hello" | HELLO |
| 2 | 모두 대문자 | "HELLO" | HELLO |
데이터가 행으로 스트리밍될 때, 각 데이터 항목은 해당 값을 제공하는 열의 유형과 일치해야 한다는 조건이 적용됩니다. 조건 중 하나라도 충족되지 않으면 테스트가 중단됩니다.
주어진 테스트 함수의 데이터 테이블에서 행과 열의 이름은 고유해야 합니다. 두 행이 같은 이름을 가지거나 두 열이 같은 이름을 가질 경우, (Qt 6.5부터) 경고가 발생합니다. 경고를 오류로 처리하는 방법은 qWarning()을, 테스트에서 다른 경고를 제거하는 방법은 Test for Warnings를 참조하십시오.
테스트 함수 재작성
이제 테스트 함수를 다음과 같이 다시 작성할 수 있습니다:
void TestQString::toUpper()
{
QFETCH(QString, string);
QFETCH(QString, result);
QCOMPARE(string.toUpper(), result);
}TestQString::toUpper() 함수는 관련 TestQString::toUpper_data() 함수에서 생성한 테스트 테이블의 각 항목에 대해 한 번씩, 총 세 번 실행됩니다.
먼저, ` QFETCH()` 매크로를 사용하여 데이터 세트의 두 요소를 가져옵니다. ` QFETCH()`는 두 개의 인수를 받습니다: 요소의 데이터 유형과 요소 이름입니다. 그런 다음 ` QCOMPARE()` 매크로를 사용하여 테스트를 수행합니다.
이 접근 방식을 사용하면 테스트 자체를 수정하지 않고도 테스트에 새로운 데이터를 매우 쉽게 추가할 수 있습니다.
독립 실행 파일 준비
또한, 테스트 케이스를 독립 실행형으로 만들기 위해서는 다음 두 줄이 필요합니다:
QTEST_MAIN(TestQString)
#include "testqstring.moc"앞서와 마찬가지로, QTEST_MAIN() 매크로는 모든 테스트 함수를 실행하는 간단한 main() 메서드로 확장되며, 테스트 클래스의 선언과 구현이 모두 .cpp 파일에 있으므로 Qt의 인트로스펙션이 작동하도록 생성된 moc 파일도 포함해야 합니다.
실행 파일 빌드
CMake나 qmake를 사용하여 테스트 케이스 실행 파일을 빌드할 수 있습니다.
CMake를 사용한 빌드
CMakeLists.txt 파일에서 빌드 설정을 구성하십시오:
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(tutorial2 LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)
qt_standard_project_setup()
qt_add_executable(tutorial2
testqstring.cpp
)
set_target_properties(tutorial2 PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(tutorial2 PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Test
Qt6::Widgets
)
install(TARGETS tutorial2
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
qt_generate_deploy_app_script(
TARGET tutorial2
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})다음으로, 명령줄에서 ` cmake `을 실행하거나 Qt-prefix/<version>/<platform>/bin/qt-cmake 에 위치한 ` qt-cmake ` 편의 스크립트를 사용하십시오:
<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja그런 다음, 선호하는 생성기 도구를 실행하여 실행 파일을 빌드하세요. 여기서는 Ninja를 사용합니다:
ninjaqmake를 사용한 빌드
.pro 파일에서 빌드 설정을 구성하십시오:
QT += widgets testlib
SOURCES = testqstring.cpp
# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial2
INSTALLS += target다음으로 qmake 을 실행하고, 마지막으로 make 을 실행하여 실행 파일을 빌드하십시오:
qmake
make실행 파일 실행
빌드된 실행 파일을 실행하면 다음과 같은 출력이 표시됩니다:
********* Start testing of TestQString *********
Config: Using QtTest library %VERSION%, Qt %VERSION%
PASS : TestQString::initTestCase()
PASS : TestQString::toUpper(all-lower)
PASS : TestQString::toUpper(mixed)
PASS : TestQString::toUpper(all-upper)
PASS : TestQString::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted, 0ms
********* Finished testing of TestQString *********© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.