{"id":690,"date":"2018-03-26T07:01:49","date_gmt":"2018-03-26T07:01:49","guid":{"rendered":"http:\/\/redmonk.com\/fryan\/?p=690"},"modified":"2018-03-26T17:25:29","modified_gmt":"2018-03-26T17:25:29","slug":"a-look-at-unit-testing-frameworks","status":"publish","type":"post","link":"https:\/\/redmonk.com\/fryan\/2018\/03\/26\/a-look-at-unit-testing-frameworks\/","title":{"rendered":"A Look at Unit Testing Frameworks"},"content":{"rendered":"<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-691\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small.jpg\" alt=\"\" width=\"1280\" height=\"851\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small.jpg 1280w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small-300x199.jpg 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small-768x511.jpg 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small-1024x681.jpg 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small-480x319.jpg 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/ceramic-cute-outdoors-small-943x627.jpg 943w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>Testing is perhaps the most frequently spoken about, but most often ignored aspect of software development. As we have noted before <a href=\"http:\/\/redmonk.com\/fryan\/2016\/06\/15\/ci-the-cloud-native-on-ramp-and-the-dominance-of-jenkins\/\">CI is the onramp to cloud native,<\/a> and to be successful with CI you need to continuously improve your testing.<\/p>\n<p>The most basic level of testing that you can put in place are unit tests. It is, however, amazing to us the amount of people we talk with that do not even have basic unit testing in place. Part of this is historic, part of this is technical debt and part of it is a fear of what may be uncovered if more rigorous testing is put in place.<\/p>\n<p>This last aspect, the fear of what may be uncovered, is perhaps the most insidious. It is also the easiest to address, just adding in a single test per developer per day on a project for existing functionality quickly adds up. <a href=\"https:\/\/twitter.com\/mattjcurry\">Matt Curry<\/a> of Allstate had a lovely comment about this at <a href=\"https:\/\/springoneplatform.io\/\">SpringOne Platform<\/a> last year:<\/p>\n<blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">I think of my test suite like my bank account\u2026 I don\u2019t get to just park $1mn in one day, but if I put in $10 a day, with compounding interest, it adds up \/<a href=\"https:\/\/twitter.com\/mattjcurry?ref_src=twsrc%5Etfw\">@mattjcurry<\/a> on test automation <a href=\"https:\/\/twitter.com\/hashtag\/SpringOne?src=hash&amp;ref_src=twsrc%5Etfw\">#SpringOne<\/a><\/p>\n<p>&mdash; DormAIn \ud83e\udddf\u200d\u2640\ufe0f (aka &quot;part of the problem&quot;) (@DormainDrewitz) <a href=\"https:\/\/twitter.com\/DormainDrewitz\/status\/938171272768262144?ref_src=twsrc%5Etfw\">December 5, 2017<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>In order to narrow the focus across the plethora of possible options available we have chosen the following criteria:<\/p>\n<ol>\n<li>The unit testing framework is for one of the top five languages that appear in <a href=\"https:\/\/redmonk.com\/sogrady\/2018\/03\/07\/language-rankings-1-18\/\">the RedMonk programming language rankings<\/a>.<\/li>\n<li>The framework supports the xUnit output format, making it easier to use with a tool like Jenkins.<\/li>\n<li>The framework is an open source project.<\/li>\n<li>The framework has a reasonable level of activity around it.<\/li>\n<li>The framework has come up in our conversations with developers.<\/li>\n<\/ol>\n<p>We have not looked at front end\/UI testing (with some caveats), BDD testing, functional testing or integration testing in this analysis.<\/p>\n<p>For each of the frameworks we have taken a look at the overall activity in terms of commits and issues. As always if there is a project or framework you feel we should consider please do let us know, either in the comments or on twitter.<\/p>\n<h2>JavaScript<\/h2>\n<p>JavaScript, unsurprisingly, has one of the largest arrays of potential test frameworks. We have chosen to focus on four popular frameworks, <a href=\"https:\/\/mochajs.org\/\">MochaJS<\/a>, <a href=\"https:\/\/facebook.github.io\/jest\/\">Jest<\/a>, <a href=\"https:\/\/github.com\/avajs\/ava\">AVAJS<\/a> and <a href=\"https:\/\/github.com\/substack\/tape\">Tape<\/a>.<\/p>\n<p>Looking at StackOverflow data we see that MochaJS and Jest generate far more questions than either AvaJS or Tape. Jest has overtaken all the other frameworks in popularity terms on github but given its close association with React this is not particularly surprising.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-693\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-300x219.png\" alt=\"\" width=\"300\" height=\"219\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-300x219.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-768x561.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-1024x748.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-1536x1121.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-480x350.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-javascript-ut-so-logo-859x627.png 859w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-694\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-stars-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-695\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-commits-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-696\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Javascript-fw-issues-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>MochaJS<\/h3>\n<p>The overall velocity of the <a href=\"https:\/\/mochajs.org\/\">MochaJS<\/a> project, both in commits and issues continues to grow.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-697\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-698\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-MochaJS-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>As is often the way with the most successful JavaScript projects around the node.js ecosystem, <a href=\"https:\/\/twitter.com\/tjholowaychuk\">TJ Holowaychuk<\/a> looms large, being by far the largest contributor. Although his contributions <a href=\"https:\/\/medium.com\/@tjholowaychuk\/farewell-node-js-4ba9e7f3e52b\">drew to a close in 2014<\/a>.<\/p>\n<h3>AVAJS<\/h3>\n<p><a href=\"https:\/\/github.com\/avajs\/ava\">AVAJS<\/a> is very focussed on running tests concurrently, allowing for shorter test run times. The project is very popular but is just approaching a 1.0 release at the time of writing (March 2018).<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-699\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-700\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Ava-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Contributions to AVAJS are dominated by <a href=\"https:\/\/twitter.com\/sindresorhus\">Sindre Sorhus<\/a>, who accounts for over 50% of all contributions.<\/p>\n<h3>Jest<\/h3>\n<p><a href=\"https:\/\/facebook.github.io\/jest\/\">Jest<\/a> is a JavaScript testing framework which is primarily developed by Facebook. As with many of the tools from Facebook you do need to keep in mind that the primary focus is on what Facebooks needs. Unsurprisingly Facebook dominate both commits and issues for the project, but the overall velocity is strong<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-701\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-702\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Jest-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>While we excluded UI tests in our criteria above, <a href=\"https:\/\/facebook.github.io\/jest\/\">Jest<\/a> is frequently used for testing React based applications.<\/p>\n<h3>Tape<\/h3>\n<p><a href=\"https:\/\/github.com\/substack\/tape\">Tape<\/a>, while supporting xunit output, is a <a href=\"https:\/\/testanything.org\/\">TAP<\/a> focused testing framework for JavaScript. It has a minimal core which is easily expanded.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-703\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-704\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/javascript-Tape-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Tape development is dominated by James Halliday, who accounts for almost 50% of all contributions.<\/p>\n<h2>Java<\/h2>\n<p>Java has had a strong testing culture since the very initial development of the language, and it is fair to say that jUnit is the primary reason for this. We have chosen to look at <a href=\"https:\/\/junit.org\/\">jUnit<\/a>, versions <a href=\"https:\/\/junit.org\/junit5\/\">4<\/a> and <a href=\"https:\/\/junit.org\/junit5\/\">5<\/a>, <a href=\"http:\/\/testng.org\/doc\/\">TestNG<\/a> and <a href=\"https:\/\/arquillian.org\">Arquillian<\/a>.<\/p>\n<p>jUnit has a strong lead in terms of the number of questions on Stackoverflow, followed by TestNG. It is also the most popular java testing framework on github.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-705\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-300x219.png\" alt=\"\" width=\"300\" height=\"219\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-300x219.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-768x561.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-1024x748.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-1536x1121.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-480x350.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-java-ut-so-logo-859x627.png 859w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-706\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-stars-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-707\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-issues-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-708\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Java-fw-commits-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h3>jUnit<\/h3>\n<p>The <a href=\"https:\/\/junit.org\">jUnit<\/a> community create the 5.0 set of releases, which reached GA in September 2017, to address testing needs for Java 8 and beyond. The 4.0 train remains in extremely heavy use.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-709\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-710\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.4-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-711\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-712\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-JUnit.5-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>It is important to point out that jUnit has been around a long time, so our commercial attributions of contributions may have some gaps. \u00a0David Saff at Google remains the leading contributor, and we have not put any commercial attribution on the contributions of Kent Beck or Marc Phillip.<\/p>\n<h3>TestNG<\/h3>\n<p><a href=\"http:\/\/testng.org\/doc\/\">TestNG<\/a> originated out of some specific frustrations with jUnit, which its original author, and primary contributor, <a href=\"https:\/\/twitter.com\/cbeust\">Cedric Beust<\/a> had encountered.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-713\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-714\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-TestNG-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>There is a strong community around TestNG, and we hear TestNG mentioned reasonably regularly.<\/p>\n<h3>Arquillian<\/h3>\n<p><a href=\"https:\/\/arquillian.org\">Arquillian<\/a> is a testing framework which is part of the jBoss community. It has evolved in recent times to include a strong focus on testing microservices.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-715\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-716\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/java-Arquillian-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>As it is a jBoss project, contributions to Arquillian are dominated by Red Hat.<\/p>\n<h2>Python<\/h2>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-717\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-300x219.png\" alt=\"\" width=\"300\" height=\"219\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-300x219.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-768x561.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-1024x748.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-1536x1121.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-480x350.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-python-ut-so-logo-859x627.png 859w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>While there are a variety of testing frameworks for Python, we have chosen to focus on <a href=\"https:\/\/docs.pytest.org\/en\/latest\/\">py.test<\/a> and <a href=\"https:\/\/wiki.python.org\/moin\/PyUnit\">PyUnit<\/a>. PyUnit is the in-built mechanism for running unit tests in Python, and py.test is the mechanism we hear about most often. As comparing PyUnit to py.test contributions is not directly possible, we only look at stackoverflow data, where we can see a strong bias towards py.test.<\/p>\n<h2>PHP<\/h2>\n<p>PHP has consistently been in the top five languages in the RedMonk Programming Language rankings, coming in at number four in the most recent rankings. As we have noted before people can be quite dismissive of PHP, but it is incredibly widely used and this usage shows no sign of abating. We looked at two testing frameworks, <a href=\"https:\/\/phpunit.de\/\">PHPUnit<\/a> and <a href=\"https:\/\/codeception.com\/\">Codeception<\/a>.<\/p>\n<p>PHPUnit is the undoubted leader in the PHP space. Codeception is included here as developers do use it for unit testing in PHP, although it leverages PHPUnit under the hood for this purpose.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-718\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-300x219.png\" alt=\"\" width=\"300\" height=\"219\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-300x219.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-768x561.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-1024x748.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-1536x1121.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-480x350.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-php-ut-so-logo-859x627.png 859w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-719\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-stars-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-720\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-commits-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-721\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/Php-fw-issues-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>PHPUnit<\/h3>\n<h3><\/h3>\n<p><a href=\"https:\/\/phpunit.de\/\">PHPUnit<\/a> continues to be an extremely active project. The vast majority of code contributions come from <a href=\"https:\/\/twitter.com\/s_bergmann\">Sebastian Bergmann<\/a>, but the diversity of sources for issues shows a very vibrant community<\/p>\n<h3><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-722\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-723\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-PHPUnit-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/h3>\n<h3>Codeception<\/h3>\n<p><a href=\"https:\/\/codeception.com\/\">Codeception<\/a> is used for a far wider set of testing, and as noted above we have included it here as we do hear it mentioned in connection with unit tests. Its community is also pretty vibrant.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-724\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-725\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/php-Codeception-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>C#<\/h2>\n<p>There are a number of commerical offerings for C# and .NET unit testing, but we have limited our research to <a href=\"http:\/\/nunit.org\/\">NUnit<\/a> and <a href=\"https:\/\/xunit.github.io\/\">xUnit<\/a>, which are by far the most frequently cited frameworks in our discussions. Stackoverflow activity shows a bias towards NUnit.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-726\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-300x219.png\" alt=\"\" width=\"300\" height=\"219\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-300x219.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-768x561.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-1024x748.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-1536x1121.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-480x350.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/20180323-csharp-ut-so-logo-859x627.png 859w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>We have not included github stars for these projects, A more telling metric for both is the level of download activity on nuget. NUnit is just over <a href=\"https:\/\/www.nuget.org\/packages\/NUnit\">19 million downloads,<\/a> while xUnit has recently gone past <a href=\"https:\/\/www.nuget.org\/packages\/xUnit\">13.5 million downloads<\/a>.<\/p>\n<h3>NUnit<\/h3>\n<p><a href=\"http:\/\/nunit.org\/\">NUnit<\/a> was originally a port of jUnit to dotnet, but has be rewritten in version 3.0 to take advantage of a specific .net features. Project leads Charlie Poole and Rob Prouse dominate the contributions here, but the community contributes a wide range of issues.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-727\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-728\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-NUnit-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h3>xUnit<\/h3>\n<p>Brad Wilson at Microsoft is by far the largest code contributor to <a href=\"https:\/\/xunit.github.io\/\">xUnit<\/a>, but the community contributes a wide range of issues. We have not broken out code commits here as authoring versus commits is not accurately reflected in our current data gathering methodology.<\/p>\n<p><a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-729\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-ccc-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-730\" src=\"http:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-300x300.png 300w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-150x150.png 150w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-768x768.png 768w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-1024x1024.png 1024w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-1536x1536.png 1536w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-480x480.png 480w, https:\/\/redmonk.com\/fryan\/files\/2018\/03\/csharp-xunit-cci-20180323-logo-627x627.png 627w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><strong>Credits<\/strong>: <a href=\"https:\/\/www.pexels.com\/photo\/brown-ceramic-piggy-bank-164592\/\">Ceramic Piggybank image<\/a>\u00a0, <a href=\"https:\/\/creativecommons.org\/share-your-work\/public-domain\/cc0\/\">CC0 license<\/a>\u00a0by <a href=\"https:\/\/www.instagram.com\/pexelsphotos\/\">Pexels<\/a>.<\/p>\n<p><strong>Disclaimers<\/strong>: Red Hat, Google, Microsoft, Pivotal, Oracle, IBM and Century Link are current RedMonk clients.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Testing is perhaps the most frequently spoken about, but most often ignored aspect of software development. As we have noted before CI is the onramp to cloud native, and to be successful with CI you need to continuously improve your testing. The most basic level of testing that you can put in place are unit<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23,4,20,19,15,40,32,33,34,36,24],"tags":[],"class_list":["post-690","post","type-post","status-publish","format-standard","hentry","category-api","category-business","category-cio","category-community","category-developers","category-featured-data","category-frameworks","category-java","category-javascript","category-php","category-research"],"acf":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/posts\/690","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/comments?post=690"}],"version-history":[{"count":0,"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/posts\/690\/revisions"}],"wp:attachment":[{"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/media?parent=690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/categories?post=690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/redmonk.com\/fryan\/wp-json\/wp\/v2\/tags?post=690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}