<br><br>On Sunday, January 8, 2012, Fraser Hutchison &lt;<a href="mailto:fraser.hutchison@googlemail.com">fraser.hutchison@googlemail.com</a>&gt; wrote:<br>&gt; On 07/01/2012 14:41, David Cole wrote:<br>&gt;<br>&gt; On Fri, Jan 6, 2012 at 6:47 PM, David Doria &lt;<a href="mailto:daviddoria@gmail.com">daviddoria@gmail.com</a>&gt; wrote:<br>
&gt;<br>&gt; On Fri, Jan 6, 2012 at 5:54 PM, Jean-Christophe Fillion-Robin<br>&gt; &lt;<a href="mailto:jchris.fillionr@kitware.com">jchris.fillionr@kitware.com</a>&gt; wrote:<br>&gt;<br>&gt; Hi David,<br>&gt;<br>&gt; Not too long ago I was browsing the project of a friend who worked on BTK<br>
&gt; (The toolkit used by Mokka, a motion kinematic &amp; kinetic analyser) [1].<br>&gt;<br>&gt; I noticed that he is using cxxtest [2] along with ctest. It seems it could<br>&gt; to address the use case you are describing.<br>
&gt;<br>&gt; See Example integration [3] and cxxtest source [4]<br>&gt;<br>&gt; Hth<br>&gt; Jc<br>&gt;<br>&gt; [1] <a href="https://b-tk.googlecode.com/svn/web/mokka/index.html">https://b-tk.googlecode.com/svn/web/mokka/index.html</a><br>
&gt; [2] <a href="http://cxxtest.tigris.org/">http://cxxtest.tigris.org/</a><br>&gt; [3]<br>&gt; <a href="https://code.google.com/p/b-tk/source/browse/BTK/trunk/Testing/Code/C3DFileReaderTest.h">https://code.google.com/p/b-tk/source/browse/BTK/trunk/Testing/Code/C3DFileReaderTest.h</a><br>
&gt; [4]<br>&gt; <a href="https://code.google.com/p/b-tk/source/browse/#svn%2FBTK%2Ftrunk%2FUtilities%2FCxxTest%2Fcxxtest">https://code.google.com/p/b-tk/source/browse/#svn%2FBTK%2Ftrunk%2FUtilities%2FCxxTest%2Fcxxtest</a><br>
&gt;<br>&gt; Thanks Jean-Christophe. So I guess the short answer is &quot;ctest can&#39;t do this&quot;.<br>&gt;<br>&gt; It seems they have made significant modifications to CxxTest so that<br>&gt; the bin/cxxtestgen that ships with CxxTest is no longer required<br>
&gt; (they&#39;ve replaced it with C macros). I like the BTK way better :)<br>&gt;<br>&gt; I guess I&#39;m not sure what the advantage of using CTest along with<br>&gt; something like CxxTest is. If you build an executable using CMake,<br>
&gt; then why not just run ./MyTests from the terminal instead of making an<br>&gt; interface so that you can call &#39;ctest&#39;. CTest will report a single<br>&gt; pass or fail, because as far as it is concerned there is only one<br>
&gt; test, right? The relevant file is<br>&gt; <a href="https://code.google.com/p/b-tk/source/browse/BTK/trunk/Testing/Code/CMakeLists.txt">https://code.google.com/p/b-tk/source/browse/BTK/trunk/Testing/Code/CMakeLists.txt</a><br>
&gt; that only has one add_test call.<br>&gt;<br>&gt; Any thoughts?<br>&gt;<br>&gt; David<br>&gt; --<br>&gt;<br>&gt; Powered by <a href="http://www.kitware.com">www.kitware.com</a><br>&gt;<br>&gt; Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>&gt; Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ">http://www.cmake.org/Wiki/CMake_FAQ</a><br>&gt;<br>&gt; Follow this link to subscribe/unsubscribe:<br>&gt; <a href="http://www.cmake.org/mailman/listinfo/cmake">http://www.cmake.org/mailman/listinfo/cmake</a><br>
&gt;<br>&gt; Sounds like you want to use GTest / GoogleTest, much like SimpleITK does.<br>&gt;<br>&gt; See the macro &quot;ADD_GOOGLE_TESTS&quot; in the SimpleITK project, in the file<br>&gt; SimpleITK/Testing/Unit/CMakeLists.txt.<br>
&gt;<br>&gt; The macro parses the actual test cxx source files, and constructs<br>&gt; &quot;filtered&quot; add_test calls, such that:<br>&gt;<br>&gt; - if a cxx file defines 5 tests, add_test is called 5 times, each test<br>
&gt; run via add_test runs exactly one of your tests from the cxx file.<br>&gt;<br>&gt; There are other projects that are also doing similar things with<br>&gt; gtest. The fairly new open chemistry project MolCore also uses gtest.<br>
&gt; That project explicitly lists its tests in the CMakeLists file such<br>&gt; that you&#39;d have to update the CMakeLists.txt file whenever you add a<br>&gt; test case to an existing cxx test source file.<br>&gt;<br>&gt; You are correct: ctest does nothing to support this explicitly. (Aside<br>
&gt; from cmake providing a FindGTest.cmake module...) An add_test call<br>&gt; tells ctest &quot;run this one test, with this one command line.&quot; It&#39;s up<br>&gt; to you to write those tests and tell us about them.<br>
&gt;<br>&gt; But there are fairly easy ways to do what you want, and still drive<br>&gt; the tests, individually, with ctest.<br>&gt;<br>&gt;<br>&gt; HTH,<br>&gt; David C.<br>&gt; --<br>&gt;<br>&gt; Powered by <a href="http://www.kitware.com">www.kitware.com</a><br>
&gt;<br>&gt; Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><br>&gt;<br>&gt; Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
&gt;<br>&gt; Follow this link to subscribe/unsubscribe:<br>&gt; <a href="http://www.cmake.org/mailman/listinfo/cmake">http://www.cmake.org/mailman/listinfo/cmake</a><br>&gt;<br>&gt; We found a few issues using gtest in the way you describe David:<br>
&gt;<br>&gt; Parsing C++ code isn&#39;t CMake&#39;s thing, so it becomes increasingly difficult to support anything other than very simple gtest macros (like TEST_P, TYPED_TEST, TYPED_TEST_P).  We do handle these macros now, but I&#39;m sure it&#39;s pretty fragile, and we don&#39;t even attempt to handle things like C++ namespace rules within test files!<br>
&gt; gtest provides the ability to set up (potentially costly) test environments which persist throughout execution of all tests, rather than on a per-test basis.  Using this, and then having CTest invoke each test individually totally defeats the purpose of this feature.<br>
&gt; Commenting out a test using block comments leaves the test name unchanged, so CTest still tries to run it.<br>&gt; If a gtest exe is run with a filter which doesn&#39;t match any test names, it runs 0 tests and returns 0 which CTest interprets as success.  This could happen if 3 above were the case.  We&#39;ve got a policy of using the following in main() to avoid reporting success:<br>
&gt;<br>&gt;     int result(RUN_ALL_TESTS());<br>&gt;     int test_count(testing::UnitTest::GetInstance()-&gt;test_to_run_count());<br>&gt;     return (test_count == 0) ? -1 : result;<br>&gt;<br>&gt; gtest exes can be run with the flag --gtest_list_tests which outputs all test names in that exe.  It would be great to use that to generate the list of filters needed, but that suffers from needing the exe to exist before CMake is run.  So if a new test case is added, it won&#39;t be run by CTest until CMake is re-run.<br>
&gt;<br>&gt; Having said all that, we continue to like gtest and are fairly used to the limitations mentioned above.  Whatever problems we&#39;ve hit, there&#39;s always been a CTest way to get round the issue.<br>&gt;<br>
&gt; Cheers,<br>&gt;<br>&gt; Fraser.<br>&gt;<br>&gt;<br><br>Interesting. Thx for chiming in.<br><br>Let us know if you have any suggestions or good ideas for how we could improve things. Maybe a test property that identifies an exe as a gtest exe, and then runs it to figure out the list of tests to run.<br>
<br><br>David<br>