Hi all,
There was a talk about using gtest or something else for unit testing. I had
suggested Catch instead, however, I think everyone without looking or trying
anything out said gtest. So to help get a real test written I have various PR
coming with unit tests. I had my interns write tests in both gtest and catch
and report out on what they felt was best and why. The result came back and was
a clear win to using Catch, not gtest.
So what are the pro and cons I was given?
Both support:
- using classes to share data and help with setup and teardown cases
- both provide a main function for calling all the tests
- both allow to break up test into multiple programs or as a one big one test
- call specific or multiple tests via command line options
Differences:
- has larger documentation, however, the design of catch requires less, and
most information needed for a test can be found cleaning in the header
- Catch is only a single headers, much easier to compile with. gtest
requires compiling a support library. the basic setup here is that gtest is
more complex to get the basics working
- The assertion logic is different.
- The difference is in that gtest has a form of
- ASSERT_<TYPE>.. ie ASSERT_EQ, ASSERT_NE, etc...
- Catch as a decoupled form of basic concepts with predicates
- REQUIRE_THAT( result, PRED(VALUE)) such as REQUIRE_THAT( myStr,
EndWith("as a service"))
- Catch allows an easy combination of different predicted or existing with
custom predicates, gtest was not so clear. There was difficulty finding the
right macro to call for certain cases. It was not always obvious, and there are
a LOT of them.
- This is where the documentation for gtest was nice to help find what of
the too many macros to use
- Catch on the other have was a simple look up in a header for something
like equal, or greater, or contains and just use that with the high level
condition statement. This was found to be easier than googling or searching the
massive gtest document.
- Catch has some high level BDD style control flow. The interns did not use
this, but thought if would be useful if I made them write more tests. given
they had to implement some more scenario based tests
- Catch appears easier to extend with custom behaviors, which gtest appears
more difficult. Gtests seems to try to include all the combination defined as a
huge set of macro, etc, which Catch define a means to compose different
combination and tries to provide the basic items to compose what you need, and
if you ned something special, you just add a function and you are done.
- the basic reporting of error was viewed as more useful for Catch.. for
example:
gtest output:
- Running main() from gtest_main.cc[==========] Running 1 test from 1 test
case.[----------] Global test environment set-up.[----------] 1 test from
testgogogo[ RUN ] testgogogo.firstgtest.cc:12: Failure Expected: 1To
be equal to: gogogo(2) Which is: 2[ FAILED ] testgogogo.first (0
ms)[----------] 1 test from testgogogo (0 ms total)
[----------] Global test environment tear-down[==========] 1 test from 1 test
case ran. (0 ms total)[ PASSED ] 0 tests.[ FAILED ] 1 test, listed below:[
FAILED ] testgogogo.first
Catch output:
-
-------------------------------------------------------------------------------test
case
1-------------------------------------------------------------------------------test.cc:17...............................................................................
test.cc:18: FAILED: REQUIRE( gogogo(2) == 1 )with expansion: 2 == 1
===============================================================================test
cases: 1 | 1 failedassertions: 1 | 1 failed
either way That is the main data I have
The summary is recommend we use Catch not gtest for unit testing.I plan to add
to a PR some tests with Catch under tests/unit-tests/
Jason