{"id":98806,"date":"2019-10-01T07:00:15","date_gmt":"2019-10-01T04:00:15","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=98806"},"modified":"2019-09-30T12:06:50","modified_gmt":"2019-09-30T09:06:50","slug":"efficient-enterprise-testing-workflows-code-quality","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html","title":{"rendered":"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6)"},"content":{"rendered":"<p>This part of the article will cover the impact of having effective workflows during our development sessions as well as how proper test code quality enables us to create maintainable tests, especially for complex projects.<\/p>\n<p><strong>Development workflows &amp; pipelines<\/strong><\/p>\n<p>Programming is a flow activity and we developers should be interested in keeping our workflow efficient and the turnaround times low, in order to not get distracted by waiting times.<\/p>\n<p>In general, we want to make sure that the overall run time of our tests doesn\u2019t exceed a few seconds, at least for all tests that we execute during our \u201cchange-verify-repeat\u201d cycle. During development, it\u2019s crucial to have a quick turnaround for this cycle which spans from making some changes in the project to verifying that the changes work as expected in a production-like setting.<\/p>\n<p>It would be too slow if we would do this verification only through a pipeline that builds and deploys our application from scratch each and every time\u2009\u2014\u2009no matter whether that runs locally or not. For this reason, it\u2019s advisable to create a development setup that listens for file changes, then modifies the applications to reflect our code changes, by redeploying the whole application or by updating single classes or files, and then quickly re-executes tests scenarios that connect to the updated application-under-test. The idea is, that it\u2019s usually much faster to only redeploy the application or parts of it, instead of starting up the processes from scratch, and keep potential other local services running. This approach makes running system tests locally even more interesting, since we can re-execute the test scenarios against the running system, and instantly verify our changes.<\/p>\n<p>More specifically, a local workflow can be to: <em>recompile<\/em> the classes, execute unit test, (hot-)deploy the application, and execute the idempotent integration tests. This whole cycle should not exceed much more than one or two seconds, otherwise our attention wanders elsewhere. We can potentially split integration tests, due to their startup and execution time, system tests that take longer, or any other more complex scenarios, to a separate test suite that is executed less frequently or only runs in the CI\/CD pipeline.<\/p>\n<p>For Java Enterprise projects, have a look at <a href=\"https:\/\/wad.sh\/\">WAD<\/a> or the <a href=\"https:\/\/blog.sebastian-daschner.com\/entries\/openliberty-plugin-dev-mode\">Liberty plugin development mode<\/a>.<\/p>\n<p><strong>Test code quality &amp; maintainable tests<\/strong><\/p>\n<p>The biggest issue that leads to insufficient testing in projects is the lack of maintainable test code. In many cases, tests are written, or rather copy-and-pasted, in a way that makes is very hard to change them once a bigger change in the production code is made. That means, test code is typically treated with less attention to its quality. That goes well as long as there are only very few test cases. However, what you typically see in projects is that as the code base grows more complex, the test suite becomes less and less maintainable, just like our production code, if we wouldn\u2019t apply refactoring.<\/p>\n<p>That\u2019s the main point in having maintainable tests: applying the same code quality principles, especially separating concerns and introducing abstraction layers. It\u2019s possible and highly advisable to create re-usable components within your test scope, if care is taken not to introduce leaky abstractions.<\/p>\n<p>Let\u2019s look at an example that illustrates this further. We start with what I sometimes call \u201ccomment-first programming\u201d, where we write in code comments, pseudo code, or even on paper, what our test scenarios should verify, on a purely conceptual, business-logical level. For example, \u201ccreate an <em>Espresso<\/em> coffee order with size <em>large<\/em>\u201d. Or \u201cverify that the order is in the system with type <em>Espresso<\/em> and size <em>large<\/em>\u201d That\u2019s it. <em>How<\/em> that order is created is not a part of this level but implemented in a lower abstraction, a separate method, or typically separate delegate. The same is true for low-level verification, for example, to check whether the correct HTTP status code and expected JSON structure has been sent back. We should take care not to leak information that is only relevant on the detailed level, such as JSON structure, to the delegating method.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>You can have a look at <a href=\"https:\/\/blog.sebastian-daschner.com\/entries\/rest_acceptance_tests_video\" target=\"_blank\" rel=\"noopener noreferrer\">this video<\/a> to see an example flow how that is implemented. From a tester\u2019s or domain expert\u2019s perspective this approach makes a lot of sense, since we\u2019re start which what scenarios we want to test, not how they are implemented. If the implementation changes, e.g. the communication with the systems changes from HTTP to something else, only a single place needs to be adapted. Furthermore, our test case methods become very readable, since they precisely express the idea of what is tested; if we\u2019re interested in the how, we\u2019ll find that in the lower level.<\/p>\n<p>For example, the following system tests verifies the creation of a coffee order:<\/p>\n<div>\n<div id=\"highlighter_287973\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">class<\/code> <code class=\"java plain\">CreateOrderTest {<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">CoffeeOrderSystem coffeeOrderSystem;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">private<\/code> <code class=\"java plain\">BaristaSystem baristaSystem;<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@BeforeEach<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">setUp() {<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">coffeeOrderSystem = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">CoffeeOrderSystem();<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">baristaSystem = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">BaristaSystem();<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number11 index10 alt2\">&nbsp;<\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createVerifyOrder() {<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">List&lt;URI&gt; originalOrders = coffeeOrderSystem.getOrders();<\/code><\/div>\n<div class=\"line number15 index14 alt2\">&nbsp;<\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Order order = <\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Order(<\/code><code class=\"java string\">\"Espresso\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"Colombia\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">URI orderUri = coffeeOrderSystem.createOrder(order);<\/code><\/div>\n<div class=\"line number18 index17 alt1\">&nbsp;<\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">Order loadedOrder = coffeeOrderSystem.getOrder(orderUri);<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertThat(loadedOrder).isEqualToComparingOnlyGivenFields(order,<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java string\">\"type\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"origin\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number22 index21 alt1\">&nbsp;<\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertThat(coffeeOrderSystem.getOrders()).hasSize(originalOrders.size() + <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number25 index24 alt2\">&nbsp;<\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">...<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Even a non-technical domain expert could, without having knowledge about Java, understand what that test scenario is executing, if they know the domain behind <em>orders<\/em>, <em>coffee types<\/em>, and <em>origins<\/em>, and if they\u2019re comfortable with ignoring the Java-specific syntax.<\/p>\n<p>This is the reason why I claim it\u2019s more important to focus on test code patterns rather that specific test frameworks. For real-world projects it\u2019s crucial to introduce proper test code quality, mostly crafting abstraction layers and separating concerns into delegates. Especially when the projects grow more complex, this difference shows very quickly.<\/p>\n<p>The next part of the article series will cover test frameworks and when to apply them.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Sebastian Daschner, partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">JCG program<\/a>. See the original article here: <a href=\"https:\/\/blog.sebastian-daschner.com\/entries\/thoughts-on-efficient-testing-workflows\" target=\"_blank\" rel=\"noopener noreferrer\">Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6)<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>This part of the article will cover the impact of having effective workflows during our development sessions as well as how proper test code quality enables us to create maintainable tests, especially for complex projects. Development workflows &amp; pipelines Programming is a flow activity and we developers should be interested in keeping our workflow efficient &hellip;<\/p>\n","protected":false},"author":7568,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[273],"class_list":["post-98806","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-testing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6) - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about effective workflows? Check our article covering the impact of having effective workflows during development sessions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6) - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about effective workflows? Check our article covering the impact of having effective workflows during development sessions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-01T04:00:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sebastian Daschner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@DaschnerS\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Daschner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html\"},\"author\":{\"name\":\"Sebastian Daschner\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c0cd4930fe5f0a7be847ee87863ea665\"},\"headline\":\"Efficient enterprise testing \u2014 workflows &amp; code quality (4\\\/6)\",\"datePublished\":\"2019-10-01T04:00:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html\"},\"wordCount\":963,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"Testing\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html\",\"name\":\"Efficient enterprise testing \u2014 workflows &amp; code quality (4\\\/6) - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2019-10-01T04:00:15+00:00\",\"description\":\"Interested to learn about effective workflows? Check our article covering the impact of having effective workflows during development sessions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/10\\\/efficient-enterprise-testing-workflows-code-quality.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Efficient enterprise testing \u2014 workflows &amp; code quality (4\\\/6)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c0cd4930fe5f0a7be847ee87863ea665\",\"name\":\"Sebastian Daschner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5f7cd4d32ab6265242b5c9fdb10e6be68a6a583d8863f746fd9852b8149bbd9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5f7cd4d32ab6265242b5c9fdb10e6be68a6a583d8863f746fd9852b8149bbd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5f7cd4d32ab6265242b5c9fdb10e6be68a6a583d8863f746fd9852b8149bbd9?s=96&d=mm&r=g\",\"caption\":\"Sebastian Daschner\"},\"description\":\"Sebastian Daschner is a self-employed Java consultant and trainer. He is the author of the book 'Architecting Modern Java EE Applications'. Sebastian is a Java Champion, Oracle Developer Champion and JavaOne Rockstar.\",\"sameAs\":[\"https:\\\/\\\/blog.sebastian-daschner.com\\\/\",\"https:\\\/\\\/x.com\\\/DaschnerS\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/sebastian-daschner\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6) - Java Code Geeks","description":"Interested to learn about effective workflows? Check our article covering the impact of having effective workflows during development sessions.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html","og_locale":"en_US","og_type":"article","og_title":"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6) - Java Code Geeks","og_description":"Interested to learn about effective workflows? Check our article covering the impact of having effective workflows during development sessions.","og_url":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-10-01T04:00:15+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Sebastian Daschner","twitter_card":"summary_large_image","twitter_creator":"@DaschnerS","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Sebastian Daschner","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html"},"author":{"name":"Sebastian Daschner","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c0cd4930fe5f0a7be847ee87863ea665"},"headline":"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6)","datePublished":"2019-10-01T04:00:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html"},"wordCount":963,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["Testing"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html","url":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html","name":"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6) - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2019-10-01T04:00:15+00:00","description":"Interested to learn about effective workflows? Check our article covering the impact of having effective workflows during development sessions.","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2019\/10\/efficient-enterprise-testing-workflows-code-quality.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Efficient enterprise testing \u2014 workflows &amp; code quality (4\/6)"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c0cd4930fe5f0a7be847ee87863ea665","name":"Sebastian Daschner","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c5f7cd4d32ab6265242b5c9fdb10e6be68a6a583d8863f746fd9852b8149bbd9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c5f7cd4d32ab6265242b5c9fdb10e6be68a6a583d8863f746fd9852b8149bbd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c5f7cd4d32ab6265242b5c9fdb10e6be68a6a583d8863f746fd9852b8149bbd9?s=96&d=mm&r=g","caption":"Sebastian Daschner"},"description":"Sebastian Daschner is a self-employed Java consultant and trainer. He is the author of the book 'Architecting Modern Java EE Applications'. Sebastian is a Java Champion, Oracle Developer Champion and JavaOne Rockstar.","sameAs":["https:\/\/blog.sebastian-daschner.com\/","https:\/\/x.com\/DaschnerS"],"url":"https:\/\/www.javacodegeeks.com\/author\/sebastian-daschner"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/98806","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/7568"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=98806"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/98806\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=98806"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=98806"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=98806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}