CppUnit
Unit testing framework module
- 5 min read
- 1 chapter
Related on Lably
Through LibreOffice
The framework runs tests in suites. Test result output is sent to a filter, the most basic being a simple pass or fail count printed out, or more advanced filters allowing XML output compatible with continuous integration reporting systems.The project has been forked several times. The freedesktop.org version at GitHub, maintained by Markus Mohrhard of the LibreOffice project (which uses CppUnit heavily), was actively maintained until 2020, and is used in Linux distributions such as Debian, Ubuntu, Gentoo and Arch.Some libraries, such as POCO C++ Libraries, provide their own APIs to consume the CppUnit library.
Example
Consider the following class Integer:
<span id="mwOQ"></span><span class="k" id="mwOg">module</span><span class="p" id="mwOw">;</span> <span class="k" id="mwPA">export</span><span class="w" id="mwPQ"> </span><span class="k" id="mwPg">module</span><span class="w" id="mwPw"> </span><span class="n" id="mwQA">wikipedia</span><span class="p" id="mwQQ">.</span><span class="n" id="mwQg">examples</span><span class="p" id="mwQw">.</span><span class="n" id="mwRA">Integer</span><span class="p" id="mwRQ">;</span> <span class="k" id="mwRg">export</span><span class="w" id="mwRw"> </span><span class="k" id="mwSA">namespace</span><span class="w" id="mwSQ"> </span><span class="nn" id="mwSg">wikipedia</span><span class="o" id="mwSw">::</span><span class="nn" id="mwTA">examples</span><span class="w" id="mwTQ"> </span><span class="p" id="mwTg">{</span> <span class="k" id="mwTw">class</span><span class="w" id="mwUA"> </span><span class="nc" id="mwUQ">Integer</span><span class="w" id="mwUg"> </span><span class="p" id="mwUw">{</span> <span class="k" id="mwVA">private</span><span class="o" id="mwVQ">:</span> <span class="w" id="mwVg"> </span><span class="kt" id="mwVw">int</span><span class="w" id="mwWA"> </span><span class="n" id="mwWQ">x</span><span class="w" id="mwWg"> </span><span class="o" id="mwWw">=</span><span class="w" id="mwXA"> </span><span class="mi" id="mwXQ">0</span><span class="p" id="mwXg">;</span> <span class="k" id="mwXw">public</span><span class="o" id="mwYA">:</span> <span class="w" id="mwYQ"> </span><span class="n" id="mwYg">Integer</span><span class="p" id="mwYw">(</span><span class="kt" id="mwZA">int</span><span class="w" id="mwZQ"> </span><span class="n" id="mwZg">x</span><span class="p" id="mwZw">)</span><span class="o" id="mwaA">:</span> <span class="w" id="mwaQ"> </span><span class="n" id="mwag">x</span><span class="p" id="mwaw">{</span><span class="n" id="mwbA">x</span><span class="p" id="mwbQ">}</span><span class="w" id="mwbg"> </span><span class="p" id="mwbw">{}</span> <span class="w" id="mwcA"> </span><span class="p" id="mwcQ">[[</span><span class="na" id="mwcg">nodiscard</span><span class="p" id="mwcw">]]</span> <span class="w" id="mwdA"> </span><span class="kt" id="mwdQ">int</span><span class="w" id="mwdg"> </span><span class="n" id="mwdw">add</span><span class="p" id="mweA">(</span><span class="kt" id="mweQ">int</span><span class="w" id="mweg"> </span><span class="n" id="mwew">y</span><span class="p" id="mwfA">)</span><span class="w" id="mwfQ"> </span><span class="k" id="mwfg">noexcept</span><span class="w" id="mwfw"> </span><span class="p" id="mwgA">{</span> <span class="w" id="mwgQ"> </span><span class="n" id="mwgg">x</span><span class="w" id="mwgw"> </span><span class="o" id="mwhA">+=</span><span class="w" id="mwhQ"> </span><span class="n" id="mwhg">y</span><span class="p" id="mwhw">;</span> <span class="w" id="mwiA"> </span><span class="k" id="mwiQ">return</span><span class="w" id="mwig"> </span><span class="n" id="mwiw">x</span><span class="p" id="mwjA">;</span> <span class="w" id="mwjQ"> </span><span class="p" id="mwjg">}</span> <span class="w" id="mwjw"> </span><span class="p" id="mwkA">[[</span><span class="na" id="mwkQ">nodiscard</span><span class="p" id="mwkg">]]</span> <span class="w" id="mwkw"> </span><span class="kt" id="mwlA">int</span><span class="w" id="mwlQ"> </span><span class="n" id="mwlg">subtract</span><span class="p" id="mwlw">(</span><span class="kt" id="mwmA">int</span><span class="w" id="mwmQ"> </span><span class="n" id="mwmg">y</span><span class="p" id="mwmw">)</span><span class="w" id="mwnA"> </span><span class="k" id="mwnQ">noexcept</span><span class="w" id="mwng"> </span><span class="p" id="mwnw">{</span> <span class="w" id="mwoA"> </span><span class="n" id="mwoQ">x</span><span class="w" id="mwog"> </span><span class="o" id="mwow">-=</span><span class="w" id="mwpA"> </span><span class="n" id="mwpQ">y</span><span class="p" id="mwpg">;</span> <span class="w" id="mwpw"> </span><span class="k" id="mwqA">return</span><span class="w" id="mwqQ"> </span><span class="n" id="mwqg">x</span><span class="p" id="mwqw">;</span> <span class="w" id="mwrA"> </span><span class="p" id="mwrQ">}</span> <span class="p" id="mwrg">}</span> <span class="p" id="mwrw">}</span>It can be tested like so:
<span id="mwsw"></span><span class="k" id="mwtA">module</span><span class="p" id="mwtQ">;</span> <span class="k" id="mwtg">export</span><span class="w" id="mwtw"> </span><span class="k" id="mwuA">module</span><span class="w" id="mwuQ"> </span><span class="n" id="mwug">wikipedia</span><span class="p" id="mwuw">.</span><span class="n" id="mwvA">examples</span><span class="p" id="mwvQ">.</span><span class="n" id="mwvg">tests</span><span class="p" id="mwvw">.</span><span class="n" id="mwwA">IntegerTest</span><span class="p" id="mwwQ">;</span> <span class="k" id="mwwg">import</span><span class="w" id="mwww"> </span><span class="o" id="mwxA"><</span><span class="n" id="mwxQ">cppunit</span><span class="o" id="mwxg">/</span><span class="n" id="mwxw">extensions</span><span class="o" id="mwyA">/</span><span class="n" id="mwyQ">HelperMacros</span><span class="p" id="mwyg">.</span><span class="n" id="mwyw">h</span><span class="o" id="mwzA">></span><span class="p" id="mwzQ">;</span> <span class="k" id="mwzg">import</span><span class="w" id="mwzw"> </span><span class="n" id="mw0A">wikipedia</span><span class="p" id="mw0Q">.</span><span class="n" id="mw0g">examples</span><span class="p" id="mw0w">.</span><span class="n" id="mw1A">Integer</span><span class="p" id="mw1Q">;</span> <span class="k" id="mw1g">using</span><span class="w" id="mw1w"> </span><span class="n" id="mw2A">CppUnit</span><span class="o" id="mw2Q">::</span><span class="n" id="mw2g">TestFixture</span><span class="p" id="mw2w">;</span> <span class="k" id="mw3A">using</span><span class="w" id="mw3Q"> </span><span class="n" id="mw3g">wikipedia</span><span class="o" id="mw3w">::</span><span class="n" id="mw4A">examples</span><span class="o" id="mw4Q">::</span><span class="n" id="mw4g">Integer</span><span class="p" id="mw4w">;</span> <span class="k" id="mw5A">export</span><span class="w" id="mw5Q"> </span><span class="k" id="mw5g">namespace</span><span class="w" id="mw5w"> </span><span class="nn" id="mw6A">wikipedia</span><span class="o" id="mw6Q">::</span><span class="nn" id="mw6g">examples</span><span class="o" id="mw6w">::</span><span class="nn" id="mw7A">tests</span><span class="w" id="mw7Q"> </span><span class="p" id="mw7g">{</span> <span class="k" id="mw7w">class</span><span class="w" id="mw8A"> </span><span class="nc" id="mw8Q">IntegerTest</span><span class="o" id="mw8g">:</span><span class="w" id="mw8w"> </span><span class="k" id="mw9A">public</span><span class="w" id="mw9Q"> </span><span class="n" id="mw9g">TestFixture</span><span class="w" id="mw9w"> </span><span class="p" id="mw-A">{</span> <span class="k" id="mw-Q">private</span><span class="o" id="mw-g">:</span> <span class="w" id="mw-w"> </span><span class="n" id="mw_A">CPPUNIT_TEST_SUITE</span><span class="p" id="mw_Q">(</span><span class="n" id="mw_g">IntegerTest</span><span class="p" id="mw_w">);</span> <span class="w" id="mwAQA"> </span><span class="n" id="mwAQE">CPPUNIT_TEST</span><span class="p" id="mwAQI">(</span><span class="n" id="mwAQM">testAdd</span><span class="p" id="mwAQQ">);</span> <span class="w" id="mwAQU"> </span><span class="n" id="mwAQY">CPPUNIT_TEST</span><span class="p" id="mwAQc">(</span><span class="n" id="mwAQg">testSubtract</span><span class="p" id="mwAQk">);</span> <span class="w" id="mwAQo"> </span><span class="n" id="mwAQs">CPPUNIT_TEST_SUITE_END</span><span class="p" id="mwAQw">();</span> <span class="w" id="mwAQ0"> </span><span class="n" id="mwAQ4">Integer</span><span class="o" id="mwAQ8">*</span><span class="w" id="mwARA"> </span><span class="n" id="mwARE">i</span><span class="p" id="mwARI">;</span> <span class="k" id="mwARM">protected</span><span class="o" id="mwARQ">:</span> <span class="w" id="mwARU"> </span><span class="kt" id="mwARY">void</span><span class="w" id="mwARc"> </span><span class="n" id="mwARg">testAdd</span><span class="p" id="mwARk">()</span><span class="w" id="mwARo"> </span><span class="p" id="mwARs">{</span> <span class="w" id="mwARw"> </span><span class="n" id="mwAR0">CPPUNIT_ASSERT_EQUAL</span><span class="p" id="mwAR4">(</span><span class="mi" id="mwAR8">8</span><span class="p" id="mwASA">,</span><span class="w" id="mwASE"> </span><span class="n" id="mwASI">i</span><span class="o" id="mwASM">-></span><span class="n" id="mwASQ">add</span><span class="p" id="mwASU">(</span><span class="mi" id="mwASY">8</span><span class="p" id="mwASc">));</span><span class="w" id="mwASg"> </span><span class="c1" id="mwASk">// 5 + 3 = 8</span> <span class="w" id="mwASo"> </span><span class="p" id="mwASs">}</span> <span class="w" id="mwASw"> </span><span class="kt" id="mwAS0">void</span><span class="w" id="mwAS4"> </span><span class="nf" id="mwAS8">testSubtract</span><span class="p" id="mwATA">()</span><span class="w" id="mwATE"> </span><span class="p" id="mwATI">{</span> <span class="w" id="mwATM"> </span><span class="n" id="mwATQ">CPPUNIT_ASSERT_EQUAL</span><span class="p" id="mwATU">(</span><span class="mi" id="mwATY">3</span><span class="p" id="mwATc">,</span><span class="w" id="mwATg"> </span><span class="n" id="mwATk">i</span><span class="o" id="mwATo">-></span><span class="n" id="mwATs">subtract</span><span class="p" id="mwATw">(</span><span class="mi" id="mwAT0">2</span><span class="p" id="mwAT4">));</span><span class="w" id="mwAT8"> </span><span class="c1" id="mwAUA">// 5 - 2 = 3</span> <span class="w" id="mwAUE"> </span><span class="p" id="mwAUI">}</span> <span class="k" id="mwAUM">public</span><span class="o" id="mwAUQ">:</span> <span class="w" id="mwAUU"> </span><span class="kt" id="mwAUY">void</span><span class="w" id="mwAUc"> </span><span class="n" id="mwAUg">setUp</span><span class="p" id="mwAUk">()</span><span class="w" id="mwAUo"> </span><span class="k" id="mwAUs">override</span><span class="w" id="mwAUw"> </span><span class="p" id="mwAU0">{</span> <span class="w" id="mwAU4"> </span><span class="n" id="mwAU8">i</span><span class="w" id="mwAVA"> </span><span class="o" id="mwAVE">=</span><span class="w" id="mwAVI"> </span><span class="k" id="mwAVM">new</span><span class="w" id="mwAVQ"> </span><span class="n" id="mwAVU">Integer</span><span class="p" id="mwAVY">(</span><span class="mi" id="mwAVc">5</span><span class="p" id="mwAVg">);</span> <span class="w" id="mwAVk"> </span><span class="p" id="mwAVo">}</span> <span class="w" id="mwAVs"> </span><span class="kt" id="mwAVw">void</span><span class="w" id="mwAV0"> </span><span class="n" id="mwAV4">tearDown</span><span class="p" id="mwAV8">()</span><span class="w" id="mwAWA"> </span><span class="k" id="mwAWE">override</span><span class="w" id="mwAWI"> </span><span class="p" id="mwAWM">{</span> <span class="w" id="mwAWQ"> </span><span class="k" id="mwAWU">delete</span><span class="w" id="mwAWY"> </span><span class="n" id="mwAWc">i</span><span class="p" id="mwAWg">;</span> <span class="w" id="mwAWk"> </span><span class="p" id="mwAWo">}</span> <span class="p" id="mwAWs">}</span>Then, it can be tested in main():
<span id="mwAXA"></span><span class="k" id="mwAXE">import</span><span class="w" id="mwAXI"> </span><span class="o" id="mwAXM"><</span><span class="n" id="mwAXQ">cppunit</span><span class="o" id="mwAXU">/</span><span class="n" id="mwAXY">ui</span><span class="o" id="mwAXc">/</span><span class="n" id="mwAXg">text</span><span class="o" id="mwAXk">/</span><span class="n" id="mwAXo">TestRunner</span><span class="p" id="mwAXs">.</span><span class="n" id="mwAXw">h</span><span class="o" id="mwAX0">></span> <span class="k" id="mwAX4">import</span><span class="w" id="mwAX8"> </span><span class="n" id="mwAYA">wikipedia</span><span class="p" id="mwAYE">.</span><span class="n" id="mwAYI">examples</span><span class="p" id="mwAYM">.</span><span class="n" id="mwAYQ">tests</span><span class="p" id="mwAYU">.</span><span class="n" id="mwAYY">IntegerTest</span><span class="p" id="mwAYc">;</span> <span class="k" id="mwAYg">using</span><span class="w" id="mwAYk"> </span><span class="n" id="mwAYo">CppUnit</span><span class="o" id="mwAYs">::</span><span class="n" id="mwAYw">TextUi</span><span class="o" id="mwAY0">::</span><span class="n" id="mwAY4">TestRunner</span><span class="p" id="mwAY8">;</span> <span class="k" id="mwAZA">using</span><span class="w" id="mwAZE"> </span><span class="n" id="mwAZI">wikipedia</span><span class="o" id="mwAZM">::</span><span class="n" id="mwAZQ">examples</span><span class="o" id="mwAZU">::</span><span class="n" id="mwAZY">tests</span><span class="o" id="mwAZc">::</span><span class="n" id="mwAZg">IntegerTest</span><span class="p" id="mwAZk">;</span> <span class="kt" id="mwAZo">int</span><span class="w" id="mwAZs"> </span><span class="nf" id="mwAZw">main</span><span class="p" id="mwAZ0">(</span><span class="kt" id="mwAZ4">int</span><span class="w" id="mwAZ8"> </span><span class="n" id="mwAaA">argc</span><span class="p" id="mwAaE">,</span><span class="w" id="mwAaI"> </span><span class="kt" id="mwAaM">char</span><span class="o" id="mwAaQ">*</span><span class="w" id="mwAaU"> </span><span class="n" id="mwAaY">argv</span><span class="p" id="mwAac">[])</span><span class="w" id="mwAag"> </span><span class="p" id="mwAak">{</span> <span class="w" id="mwAao"> </span><span class="n" id="mwAas">TestRunner</span><span class="w" id="mwAaw"> </span><span class="n" id="mwAa0">testRunner</span><span class="p" id="mwAa4">;</span> <span class="w" id="mwAa8"> </span><span class="n" id="mwAbA">runner</span><span class="p" id="mwAbE">.</span><span class="n" id="mwAbI">addTest</span><span class="p" id="mwAbM">(</span><span class="n" id="mwAbQ">IntegerTest</span><span class="o" id="mwAbU">::</span><span class="n" id="mwAbY">suite</span><span class="p" id="mwAbc">());</span> <span class="w" id="mwAbg"> </span><span class="n" id="mwAbk">runner</span><span class="p" id="mwAbo">.</span><span class="n" id="mwAbs">run</span><span class="p" id="mwAbw">();</span> <span class="p" id="mwAb0">}</span>
