@@ -54,8 +54,9 @@ Developers guide for QGIS
54
54
3.1. The QGIS testing framework - an overview
55
55
3.2. Creating a unit test
56
56
3.3. Adding your unit test to CMakeLists.txt
57
- 3.4. Building your unit test
58
- 3.5. Run your tests
57
+ 3.4. The ADD_QGIS_TEST macro explained
58
+ 3.5. Building your unit test
59
+ 3.6. Run your tests
59
60
4. HIG (Human Interface Guidelines)
60
61
5. Authors
61
62
@@ -1136,28 +1137,50 @@ line is the include for the MOC generated sources. You should replace
1136
1137
1137
1138
Adding your unit test to the build system is simply a matter of editing the
1138
1139
CMakeLists.txt in the test directory, cloning one of the existing test blocks,
1139
- and then search and replacing your test class name into it. For example:
1140
+ and then replacing your test class name into it. For example:
1140
1141
1141
1142
1142
- #
1143
1143
# QgsRasterLayer test
1144
- #
1145
- SET(qgis_rasterlayertest_SRCS testqgsrasterlayer.cpp)
1146
- SET(qgis_rasterlayertest_MOC_CPPS testqgsrasterlayer.cpp)
1147
- QT4_WRAP_CPP(qgis_rasterlayertest_MOC_SRCS ${qgis_rasterlayertest_MOC_CPPS})
1148
- ADD_CUSTOM_TARGET(qgis_rasterlayertestmoc ALL DEPENDS ${qgis_rasterlayertest_MOC_SRCS})
1149
- ADD_EXECUTABLE(qgis_rasterlayertest ${qgis_rasterlayertest_SRCS})
1150
- ADD_DEPENDENCIES(qgis_rasterlayertest qgis_rasterlayertestmoc)
1151
- TARGET_LINK_LIBRARIES(qgis_rasterlayertest ${QT_LIBRARIES} qgis_core)
1152
- INSTALL(TARGETS qgis_rasterlayertest RUNTIME DESTINATION ${QGIS_BIN_DIR})
1153
- ADD_TEST(qgis_rasterlayertest ${QGIS_BIN_DIR}/qgis_rasterlayertest)
1144
+ ADD_QGIS_TEST(rasterlayertest testqgsrasterlayer.cpp)
1154
1145
1155
1146
1156
- I'll run through these lines briefly to explain what they do, but if you are
1157
- not interested, just clone the block, search and replace e.g.
1158
1147
1148
+ 3.4. The ADD_QGIS_TEST macro explained
1149
+ ======================================
1159
1150
1160
- :'<,'>s/rasterlayer/mynewtest/g
1151
+ I'll run through these lines briefly to explain what they do, but if you are
1152
+ not interested, just do the step explained in the above section and section.
1153
+
1154
+
1155
+ MACRO (ADD_QGIS_TEST testname testsrc)
1156
+ SET(qgis_${testname}_SRCS ${testsrc} ${util_SRCS})
1157
+ SET(qgis_${testname}_MOC_CPPS ${testsrc})
1158
+ QT4_WRAP_CPP(qgis_${testname}_MOC_SRCS ${qgis_${testname}_MOC_CPPS})
1159
+ ADD_CUSTOM_TARGET(qgis_${testname}moc ALL DEPENDS ${qgis_${testname}_MOC_SRCS})
1160
+ ADD_EXECUTABLE(qgis_${testname} ${qgis_${testname}_SRCS})
1161
+ ADD_DEPENDENCIES(qgis_${testname} qgis_${testname}moc)
1162
+ TARGET_LINK_LIBRARIES(qgis_${testname} ${QT_LIBRARIES} qgis_core)
1163
+ SET_TARGET_PROPERTIES(qgis_${testname}
1164
+ PROPERTIES
1165
+ # skip the full RPATH for the build tree
1166
+ SKIP_BUILD_RPATH TRUE
1167
+ # when building, use the install RPATH already
1168
+ # (so it doesn't need to relink when installing)
1169
+ BUILD_WITH_INSTALL_RPATH TRUE
1170
+ # the RPATH to be used when installing
1171
+ INSTALL_RPATH ${QGIS_LIB_DIR}
1172
+ # add the automatically determined parts of the RPATH
1173
+ # which point to directories outside the build tree to the install RPATH
1174
+ INSTALL_RPATH_USE_LINK_PATH true)
1175
+ IF (APPLE)
1176
+ # For Mac OS X, the executable must be at the root of the bundle's executable folder
1177
+ INSTALL(TARGETS qgis_${testname} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
1178
+ ADD_TEST(qgis_${testname} ${CMAKE_INSTALL_PREFIX}/qgis_${testname})
1179
+ ELSE (APPLE)
1180
+ INSTALL(TARGETS qgis_${testname} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
1181
+ ADD_TEST(qgis_${testname} ${CMAKE_INSTALL_PREFIX}/bin/qgis_${testname})
1182
+ ENDIF (APPLE)
1183
+ ENDMACRO (ADD_QGIS_TEST)
1161
1184
1162
1185
1163
1186
Lets look a little more in detail at the individual lines. First we define the
@@ -1166,16 +1189,16 @@ methodology I described above where class declaration and definition are in the
1166
1189
same file) its a simple statement:
1167
1190
1168
1191
1169
- SET(qgis_rasterlayertest_SRCS testqgsrasterlayer.cpp )
1192
+ SET(qgis_${testname}_SRCS ${testsrc} ${util_SRCS} )
1170
1193
1171
1194
1172
1195
Since our test class needs to be run through the Qt meta object compiler (moc)
1173
1196
we need to provide a couple of lines to make that happen too:
1174
1197
1175
1198
1176
- SET(qgis_rasterlayertest_MOC_CPPS testqgsrasterlayer.cpp )
1177
- QT4_WRAP_CPP(qgis_rasterlayertest_MOC_SRCS ${qgis_rasterlayertest_MOC_CPPS })
1178
- ADD_CUSTOM_TARGET(qgis_rasterlayertestmoc ALL DEPENDS ${qgis_rasterlayertest_MOC_SRCS })
1199
+ SET(qgis_${testname}_MOC_CPPS ${testsrc} )
1200
+ QT4_WRAP_CPP(qgis_${testname}_MOC_SRCS ${qgis_${testname}_MOC_CPPS })
1201
+ ADD_CUSTOM_TARGET(qgis_${testname}moc ALL DEPENDS ${qgis_${testname}_MOC_SRCS })
1179
1202
1180
1203
1181
1204
Next we tell cmake that it must make an executeable from the test class.
@@ -1185,8 +1208,8 @@ included the moc outputs directly into our test class, so that will give it
1185
1208
executeable:
1186
1209
1187
1210
1188
- ADD_EXECUTABLE(qgis_rasterlayertest ${qgis_rasterlayertest_SRCS })
1189
- ADD_DEPENDENCIES(qgis_rasterlayertest qgis_rasterlayertestmoc )
1211
+ ADD_EXECUTABLE(qgis_${testname} ${qgis_${testname}_SRCS })
1212
+ ADD_DEPENDENCIES(qgis_${testname} qgis_${testname}moc )
1190
1213
1191
1214
1192
1215
Next we need to specify any library dependencies. At the moment classes have
@@ -1196,38 +1219,49 @@ only. Of course you also need to link to the relevant qgis libraries as
1196
1219
required by your unit test.
1197
1220
1198
1221
1199
- TARGET_LINK_LIBRARIES(qgis_rasterlayertest ${QT_LIBRARIES} qgis_core)
1200
-
1201
-
1202
- Next I tell cmake to the same place as the qgis binaries itself. This is
1203
- something I plan to remove in the future so that the tests can run directly
1204
- from inside the source tree.
1205
-
1206
-
1207
- INSTALL(TARGETS qgis_rasterlayertest RUNTIME DESTINATION ${QGIS_BIN_DIR})
1208
-
1209
-
1210
- Finally here is where the best magic happens - we register the class with
1211
- ctest. If you recall in the overview I gave in the beginning of this section we
1212
- are using both QtTest and CTest together. To recap, QtTest adds a main
1213
- method to your test unit and handles calling your test methods within the
1214
- class. It also provides some macros like QVERIFY that you can use as to test
1215
- for failure of the tests using conditions. The output from a QtTest unit test
1216
- is an executeable which you can run from the command line. However when you
1217
- have a suite of tests and you want to run each executeable in turn, and
1218
- better yet integrate running tests into the build process, the CTest is
1219
- what we use. The next line registers the unit test with CMake / CTest.
1220
-
1221
-
1222
- ADD_TEST(qgis_rasterlayertest ${QGIS_BIN_DIR}/qgis_rasterlayertest)
1223
-
1224
-
1225
- The last thing I should add is that if your test requires optional parts of the
1226
- build process (e.g. Postgresql support, GSL libs, GRASS etc.), you should take
1227
- care to enclose you test block inside a IF () block in the CMakeLists.txt file.
1228
-
1229
-
1230
- 3.4. Building your unit test
1222
+ TARGET_LINK_LIBRARIES(qgis_${testname} ${QT_LIBRARIES} qgis_core)
1223
+
1224
+
1225
+ Next I tell cmake to install the tests to the same place as the qgis binaries
1226
+ itself. This is something I plan to remove in the future so that the tests can
1227
+ run directly from inside the source tree.
1228
+
1229
+
1230
+ SET_TARGET_PROPERTIES(qgis_${testname}
1231
+ PROPERTIES
1232
+ # skip the full RPATH for the build tree
1233
+ SKIP_BUILD_RPATH TRUE
1234
+ # when building, use the install RPATH already
1235
+ # (so it doesn't need to relink when installing)
1236
+ BUILD_WITH_INSTALL_RPATH TRUE
1237
+ # the RPATH to be used when installing
1238
+ INSTALL_RPATH ${QGIS_LIB_DIR}
1239
+ # add the automatically determined parts of the RPATH
1240
+ # which point to directories outside the build tree to the install RPATH
1241
+ INSTALL_RPATH_USE_LINK_PATH true)
1242
+ IF (APPLE)
1243
+ # For Mac OS X, the executable must be at the root of the bundle's executable folder
1244
+ INSTALL(TARGETS qgis_${testname} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
1245
+ ADD_TEST(qgis_${testname} ${CMAKE_INSTALL_PREFIX}/qgis_${testname})
1246
+ ELSE (APPLE)
1247
+ INSTALL(TARGETS qgis_${testname} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
1248
+ ADD_TEST(qgis_${testname} ${CMAKE_INSTALL_PREFIX}/bin/qgis_${testname})
1249
+ ENDIF (APPLE)
1250
+
1251
+
1252
+ Finally the above uses ADD_TEST to register the test with cmake / ctest . Here
1253
+ is where the best magic happens - we register the class with ctest. If you
1254
+ recall in the overview I gave in the beginning of this section we are using
1255
+ both QtTest and CTest together. To recap, QtTest adds a main method to your
1256
+ test unit and handles calling your test methods within the class. It also
1257
+ provides some macros like QVERIFY that you can use as to test for failure of
1258
+ the tests using conditions. The output from a QtTest unit test is an
1259
+ executeable which you can run from the command line. However when you have a
1260
+ suite of tests and you want to run each executeable in turn, and better yet
1261
+ integrate running tests into the build process, the CTest is what we use.
1262
+
1263
+
1264
+ 3.5. Building your unit test
1231
1265
============================
1232
1266
1233
1267
To build the unit test you need only to make sure that ENABLE_TESTS=true in the
@@ -1240,7 +1274,7 @@ cmake configuration. There are two ways to do this:
1240
1274
Other than that, just build QGIS as per normal and the tests should build too.
1241
1275
1242
1276
1243
- 3.5 . Run your tests
1277
+ 3.6 . Run your tests
1244
1278
===================
1245
1279
1246
1280
The simplest way to run the tests is as part of your normal build process:
0 commit comments