Hi all. I've run into this problem as well - I think first-class support for this in CTest would be a most useful feature.
And I would like to nominate Boost.Test into the list of frameworks considered for support, if possible. Petr On Wed, Jan 28, 2015 at 1:38 AM, Robert Dailey <rcdailey.li...@gmail.com> wrote: > I suspect that per David's suggestion, CTest would essentially do what > you're doing but in a more thorough manner (based on the test > framework used). So essentially CTest will need: > > - A new command line parameter that specifies the test framework > - Functionality to parse the contents of source files provided to the > target the test is assigned to > > I'll try to look into this when I can. David, if you have more > specific requirements or pointers please do share them here. Thanks > for the input everyone. > > On Tue, Jan 27, 2015 at 5:08 PM, Fraser Hutchison > <fraser.hutchi...@gmail.com> wrote: > > We've run into this exact chicken and egg problem with both gtest and > Catch > > at my work too. In both cases, we've worked round the problem by writing > > fairly fragile CMake code which parses the C++ files comprising a test > > executable and ultimately calling add_test for each discovered test case. > > > > gtest is harder to handle than Catch in that it provides macros for > handling > > value-parameterised and type-parameterised tests. It would be great if > > CTest were able to handle these popular test libraries automatically. > I'm > > really short of time of the moment, but if there are any pointers from > > experts on how this might be best handled by CTest, I could perhaps > start to > > have a poke about if there are no other takers? > > > > In the meantime, here's a link to our Catch-handling code: > > > https://github.com/Fraser999/MaidSafe/blob/846ce37c23bd86ee261e439919dfd7000a8f9372/cmake_modules/add_catch_tests.cmake > > > > The file's commented at the top. It probably doesn't cover all Catch > > macros, and I'd be amazed if it handled all C++ coding styles properly, > but > > it worked fairly reliably for us. We don't use Catch any more, so I'm > not > > even sure if it works with the current version of Catch. For comparison > (of > > the complexity) here's our gtest equivalent: > > > https://github.com/Fraser999/MaidSafe/blob/72af3a0def2f03af7320696f5ea3d241c5af9bdc/cmake_modules/add_gtests.cmake > > (it's old code and could be made more efficient I'm sure - but again it > > works fine for us). > > > > Cheers, > > Fraser. > > > > > > > > On 27/01/2015 17:14, David Cole via CMake wrote: > >> > >> The best thing to do would be to make CTest aware of unit test > >> frameworks like this, and have it be automatic. > >> > >> Support for cppunit, gtest and Catch (and any other popular ones) > >> would all be appreciated by many, I'm sure. > >> > >> Got time to dig into ctest a little bit? > >> > >> > >> D > >> > >> > >> > >> On Tue, Jan 27, 2015 at 11:18 AM, Robert Dailey > >> <rcdailey.li...@gmail.com> wrote: > >>> > >>> I wouldn't say this is an artificial problem. let me go into more > detail. > >>> > >>> A single test can define any number of test cases. These are unknown > >>> to CMake scripts, as they are written and defined in code. The ideal > >>> solution is to have the test program output a list of all test cases > >>> and based on that list, automatically generate the add_test commands. > >>> That way I don't have to worry about hard-coding test case names in > >>> the build scripts. When a new test case is added to the test code (no > >>> new files would be added), "magically" a new unit test appears to > >>> CMake. > >>> > >>> But none of this can be done unless the unit test executables are > >>> built. Thus the chicken and egg problem. To do it as you suggest would > >>> require me to hard-code the test cases. Example: > >>> > >>> In MyTest.cpp: > >>> > >>> #include <catch.hpp> > >>> TEST_CASE("test1") {} > >>> TEST_CASE("test2") {} > >>> > >>> In CMakeLists.txt: > >>> > >>> add_executable( MyTest MyTest.cpp ) > >>> add_test( NAME MyTest_test1 COMMAND test1 ) > >>> add_test( NAME MyTest_test2 COMMAND test2 ) > >>> > >>> Am I correctly understanding what you have in mind? If so, can you > >>> think of a way to automate this a little better? > >>> > >>> On Tue, Jan 27, 2015 at 7:18 AM, David Cole <dlrd...@aol.com> wrote: > >>>> > >>>> It's only a chicken and egg problem if you constrain yourself > >>>> artificially. > >>>> > >>>> When you define a new unit test source file, there are two things you > >>>> need to do: > >>>> (1) add it to its executable > >>>> (2) write an add_test line that invokes that specific unit test > >>>> > >>>> You could possibly encapsulate those actions into an add_unit_test > >>>> macro so that it only seems like you have one thing to do, but > >>>> certainly, it's possible. > >>>> > >>>> You must be doing #1 already, so you just have to make sure #2 always > >>>> happens whenever #1 happens. > >>>> > >>>> Both eggs. > >>>> > >>>> > >>>> D > >>>> > >>>> > >>>> > >>>> > >>>> On Mon, Jan 26, 2015 at 4:05 PM, Robert Dailey > >>>> <rcdailey.li...@gmail.com> wrote: > >>>>> > >>>>> I believe so, but then you run into the chicken and egg problem: > >>>>> > >>>>> I need to fully build all unit tests in order to know all the test > >>>>> cases, but I need to define the tests at the generation phase (before > >>>>> build). > >>>>> > >>>>> I'm just not sure how to handle this. The best i can think of is to > >>>>> generate 1 test executable per CPP file that we write in our unit > >>>>> tests (generally 1 CPP file per class that is unit tested). Any > ideas? > >>>>> > >>>>> On Mon, Jan 26, 2015 at 10:05 AM, David Cole <dlrd...@aol.com> > wrote: > >>>>>> > >>>>>> Can you run a command that executes one test case at a time, or do > you > >>>>>> have to run all 50 when you execute the tests for a library? > >>>>>> > >>>>>> ctest just runs whatever you give it with add_test -- if you want to > >>>>>> filter a collection of unit tests to run only a single unit test, > then > >>>>>> the unit test framework you're using would have to support that. > Does > >>>>>> Catch allow you to run the tests individually? > >>>>>> > >>>>>> > >>>>>> > >>>>>> On Mon, Jan 26, 2015 at 12:30 AM, Robert Dailey > >>>>>> <rcdailey.li...@gmail.com> wrote: > >>>>>>> > >>>>>>> Hi, > >>>>>>> > >>>>>>> I'm using Catch as my unit test framework: > >>>>>>> https://github.com/philsquared/Catch > >>>>>>> > >>>>>>> Is it possible for CTest to report each TEST_CASE block as an > >>>>>>> individual test? My understanding is that CTest will only treat > each > >>>>>>> executable as a test. However, my test structure is as follows: > >>>>>>> > >>>>>>> 1 library > >>>>>>> 1 test project > >>>>>>> > >>>>>>> Each test project has 1 test CPP file per each class in the > library. > >>>>>>> This way I implement tests for classes in a corresponding CPP file. > >>>>>>> > >>>>>>> Each CPP file contains multiple test cases (defined by TEST_CASE > >>>>>>> macro). > >>>>>>> > >>>>>>> The resulting output of `ctest -T Test` shows only 1 test, even > >>>>>>> though > >>>>>>> that may be around 50 test cases. I'd like CMake to show the > >>>>>>> pass/fail > >>>>>>> status of each one. Is this possible? > >>>>>>> -- > >>>>>>> > >>>>>>> Powered by www.kitware.com > >>>>>>> > >>>>>>> Please keep messages on-topic and check the CMake FAQ at: > >>>>>>> http://www.cmake.org/Wiki/CMake_FAQ > >>>>>>> > >>>>>>> Kitware offers various services to support the CMake community. For > >>>>>>> more information on each offering, please visit: > >>>>>>> > >>>>>>> CMake Support: http://cmake.org/cmake/help/support.html > >>>>>>> CMake Consulting: http://cmake.org/cmake/help/consulting.html > >>>>>>> CMake Training Courses: http://cmake.org/cmake/help/training.html > >>>>>>> > >>>>>>> Visit other Kitware open-source projects at > >>>>>>> http://www.kitware.com/opensource/opensource.html > >>>>>>> > >>>>>>> Follow this link to subscribe/unsubscribe: > >>>>>>> http://public.kitware.com/mailman/listinfo/cmake > > > > > -- > > Powered by www.kitware.com > > Please keep messages on-topic and check the CMake FAQ at: > http://www.cmake.org/Wiki/CMake_FAQ > > Kitware offers various services to support the CMake community. For more > information on each offering, please visit: > > CMake Support: http://cmake.org/cmake/help/support.html > CMake Consulting: http://cmake.org/cmake/help/consulting.html > CMake Training Courses: http://cmake.org/cmake/help/training.html > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/cmake >
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake