{"id":100553,"date":"2019-12-25T07:00:36","date_gmt":"2019-12-25T05:00:36","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=100553"},"modified":"2019-12-08T16:48:06","modified_gmt":"2019-12-08T14:48:06","slug":"junit-5-and-selenium-improving-project-configuration","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html","title":{"rendered":"JUnit 5 and Selenium &#8211; improving project configuration"},"content":{"rendered":"<p>Selenium is a set of tools and libraries supporting browser automation and it is mainly used for web applications testing. One of the Selenium\u2019s components is a Selenium WebDriver that provides client library, the JSON wire protocol (protocol to communicate with the browser drivers) and browser drivers. One of the main advantages of Selenium WebDriver is that it supported by all major programming languages and it can run on all major operating systems.<\/p>\n<p>In this part of the <em>JUnit 5 with Selenium WebDriver &#8211; Tutorial<\/em> you will learn about additional capabilities of JUnit 5 that will help you in decreasing the execution time of your tests by running tests in parallel, configuring the order of your tests and creating parameterized tests.<\/p>\n<p>You will also learn how to take advantage of Selenium Jupiter features like tests execution configuration through system properties, single browser session tests to speed up tests execution or screenshots taking in your tests. Finally, you will learn how to add AssertJ library to your project.<\/p>\n<p><a name=\"more\"><\/a><\/p>\n<h2 class=\"wp-block-heading\">About this Tutorial<\/h2>\n<p>You are reading the third part of the <em>JUnit 5 with Selenium WebDriver &#8211; Tutorial<\/em>.<\/p>\n<p>All articles in this tutorial:<\/p>\n<ul class=\"wp-block-list\">\n<li>Part 1 &#8211; <a href=\"https:\/\/www.javacodegeeks.com\/2019\/09\/junit-selenium-setup-project-gradle-jupiter-selenium.html\">Setup the project from the ground up &#8211; Gradle with JUnit 5 and Jupiter Selenium<\/a><\/li>\n<li>Part 2 &#8211; <a href=\"https:\/\/www.javacodegeeks.com\/2019\/10\/using-pagefactory-implement-page-object-pattern.html\">Using Selenium built-in <code>PageFactory<\/code> to implement Page Object Pattern<\/a><\/li>\n<li>Part 3 &#8211; <a href=\"https:\/\/blog.codeleak.pl\/2019\/12\/junit-5-and-selenium-improving-project.html\">Improving the project configuration &#8211; executing tests in parallel, tests execution order, parameterized tests, AssertJ and more<\/a><\/li>\n<\/ul>\n<p>The source code for this tutorial can be found on <a href=\"https:\/\/github.com\/kolorobot\/junit5-selenium-todomvc-demo\">Github<\/a><\/p>\n<h2 class=\"wp-block-heading\">Parallel tests execution with JUnit 5<\/h2>\n<p>JUnit 5 comes with built-in parallel tests execution support.<\/p>\n<p>The below command will run test methods from TodoMvcTests in parallel:<\/p>\n<div>\n<div id=\"highlighter_5954\" 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\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">.\/gradlew clean test --tests *TodoMvcTests -Djunit.jupiter.execution.parallel.enabled=<\/code><code class=\"java keyword\">true<\/code> <code class=\"java plain\">-Djunit.jupiter.execution.parallel.mode.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">=concurrent<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The build was successful and during its execution you should notice that two instances of Chrome browser are running. Execution time of all tests decreased to 10 seconds in this run:<\/p>\n<div>\n<div id=\"highlighter_605246\" 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<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt; Task :test<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; createsTodo() PASSED<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; createsTodosWithSameName() PASSED<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; togglesAllTodosCompleted() PASSED<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; togglesTodoCompleted() PASSED<\/code><\/div>\n<div class=\"line number10 index9 alt1\">&nbsp;<\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; clearsCompletedTodos() PASSED<\/code><\/div>\n<div class=\"line number12 index11 alt1\">&nbsp;<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; editsTodo() PASSED<\/code><\/div>\n<div class=\"line number14 index13 alt1\">&nbsp;<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; removesTodo() PASSED<\/code><\/div>\n<div class=\"line number16 index15 alt1\">&nbsp;<\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java plain\">BUILD SUCCESSFUL in 10s<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java value\">4<\/code> <code class=\"java plain\">actionable tasks: <\/code><code class=\"java value\">4<\/code> <code class=\"java plain\">executed<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Tip: Consult the documentation for more options: <a href=\"https:\/\/junit.org\/junit5\/docs\/current\/user-guide\/#writing-tests-parallel-execution\">https:\/\/junit.org\/junit5\/docs\/current\/user-guide\/#writing-tests-parallel-execution<\/a><\/p>\n<h2 class=\"wp-block-heading\">Tests execution order with JUnit 5<\/h2>\n<p>Automated tests should be able to run independently and with no specific order as well as the result of the test should not depend on the results of previous tests. But there are situations where a specific order of test execution can be justified.<\/p>\n<p>By default, in JUnit 5 the execution of test methods is repeatable between builds hence deterministic but the algorithm is intentionally non-obvious (as authors of the library state). Fortunately, execution order can be adjusted to our needs using either built-in method orderers or by creating custom ones. We will use <code>@Order<\/code> annotation to provide ordering of test methods and we will annotate the class with <code>@TestMethodOrder<\/code> to instruct JUnit 5 that methods are ordered.<\/p>\n<div>\n<div id=\"highlighter_172418\" 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<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@ExtendWith<\/code><code class=\"java plain\">(SeleniumExtension.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java color1\">@SingleSession<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java color1\">@TestMethodOrder<\/code><code class=\"java plain\">(MethodOrderer.OrderAnnotation.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Managing Todos\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java keyword\">class<\/code> <code class=\"java plain\">TodoMvcTests {<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Order<\/code><code class=\"java plain\">(<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Creates Todo with given name\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createsTodo() {<\/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 plain\">}<\/code><\/div>\n<div class=\"line number13 index12 alt2\">&nbsp;<\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Test<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@Order<\/code><code class=\"java plain\">(<\/code><code class=\"java value\">2<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Creates Todos all with the same name\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createsTodosWithSameName() {<\/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;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\">&nbsp;<\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java comments\">\/\/ rest of the methods omitted for readability<\/code><\/div>\n<div class=\"line number22 index21 alt1\">&nbsp;<\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Read more on the test execution order in JUnit 5 in this article: <a href=\"https:\/\/www.javacodegeeks.com\/2019\/03\/test-execution-order-junit-5.html\">https:\/\/blog.codeleak.pl\/2019\/03\/test-execution-order-in-junit-5.html<\/a><\/p>\n<h2 class=\"wp-block-heading\">Single browser session with Selenium Jupiter<\/h2>\n<p>As you probably notices, for each test in <code>TodoMvcTests<\/code> class a new Chrome browser instance is started and after each test it is shutdown. This behaviour causes that the execution of the whole suite is taking quite significant time (27s in the previous execution). Selenium Jupiter comes with a handy class level annotation that allows changing this behaviour. <code>@SingleSession<\/code> annotation changes the behaviour so that an instance of the browser is initialized once before all tests and shutdown after all tests.<\/p>\n<p>To apply <code>@SingleSession<\/code> we need to slightly modify the test class and inject the driver object into a constructor instead into <code>@BeforeEach<\/code> method. We also need to take care about proper state for each test. This can be done by clearing the local storage where todos are stored in the <code>@AfterEach<\/code> method. I also created a field <code>driver<\/code> that keeps the driver object instance used in all tests.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>I tested the <code>@SingleSession<\/code> with driver injected into <code>@BeforeEach<\/code> and <code>@AfterEach<\/code> method, but it seems that this is not working as expected and each time a new test is executed a new instance of the driver is created. I believe this is another design flaw of the library.<\/p>\n<div>\n<div id=\"highlighter_155897\" 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<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">private<\/code> <code class=\"java keyword\">final<\/code> <code class=\"java plain\">ChromeDriver driver;<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java plain\">TodoMvcTests(ChromeDriver driver) {<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.driver = driver;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc = PageFactory.initElements(driver, TodoMvcPage.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc.navigateTo();<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java color1\">@AfterEach<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java keyword\">void<\/code> <code class=\"java plain\">storageCleanup() {<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">driver.getLocalStorage().clear();<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>When we execute the tests we can observe the time for executing all tests decreased significantly:<\/p>\n<div>\n<div id=\"highlighter_571801\" 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<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">.\/gradlew clean test<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">&gt; Task :test<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; editsTodo() PASSED<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; togglesTodoCompleted() PASSED<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; createsTodo() PASSED<\/code><\/div>\n<div class=\"line number10 index9 alt1\">&nbsp;<\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; removesTodo() PASSED<\/code><\/div>\n<div class=\"line number12 index11 alt1\">&nbsp;<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; togglesAllTodosCompleted() PASSED<\/code><\/div>\n<div class=\"line number14 index13 alt1\">&nbsp;<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; createsTodosWithSameName() PASSED<\/code><\/div>\n<div class=\"line number16 index15 alt1\">&nbsp;<\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.TodoMvcTests &gt; clearsCompletedTodos() PASSED<\/code><\/div>\n<div class=\"line number18 index17 alt1\">&nbsp;<\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java plain\">pl.codeleak.demos.selenium.todomvc.SeleniumTest &gt; projectIsConfigured(ChromeDriver) PASSED<\/code><\/div>\n<div class=\"line number20 index19 alt1\">&nbsp;<\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java plain\">BUILD SUCCESSFUL in 9s<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java value\">3<\/code> <code class=\"java plain\">actionable tasks: <\/code><code class=\"java value\">3<\/code> <code class=\"java plain\">executed<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Tip: If you wish to run tests from selected classes you can use test filtering that comes with Gradle test task. For example this command will run only tests from TodoMvcTests class: <code>.\/gradlew clean test --tests *.todomvc.TodoMvcTests<\/code><\/p>\n<h3 class=\"wp-block-heading\">Parallel execution of single browser session tests<\/h3>\n<p>Please note that if you will now try to execute tests in parallel using JUnit 5 parallelism the tests will fail. In parallel execution each method requires separate driver instance and with <code>@SingleSession<\/code> enabled we have a single instance shared for all tests. To fix this we need to run test configure parallel execution so that top-level classes run in parallel but methods in same thread.<\/p>\n<p>Just duplicate TodoMvcTests class and try the following command:<\/p>\n<div>\n<div id=\"highlighter_154747\" 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\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">.\/gradlew clean test --tests *TodoMvcTests -Djunit.jupiter.execution.parallel.enabled=<\/code><code class=\"java keyword\">true<\/code> <code class=\"java plain\">-Djunit.jupiter.execution.parallel.mode.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">=same_thread -Djunit.jupiter.execution.parallel.mode.classes.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">=concurrent<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>When execution in progress you should see 3 browsers running and output in terminal similar to the following:<\/p>\n<div>\n<div id=\"highlighter_552514\" 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\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&lt;===========--&gt; <\/code><code class=\"java value\">87<\/code><code class=\"java plain\">% EXECUTING [3s]<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">&gt; :test &gt; <\/code><code class=\"java value\">0<\/code> <code class=\"java plain\">tests completed<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">&gt; :test &gt; Executing test pl.codeleak.demos.selenium.todomvc.MoreTodoMvcTests<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">&gt; :test &gt; Executing test pl.codeleak.demos.selenium.todomvc.EvenMoreTodoMvcTests<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">&gt; :test &gt; Executing test pl.codeleak.demos.selenium.todomvc.TodoMvcTests<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Generic driver configuration with Selenium Jupiter<\/h2>\n<p>In the current test we inject ChromeDriver directly to the test class. But there are situations that we wish to have a bit more control over the driver injected and we would rather inject WebDriver (interface) and decide later which driver instance should be injected. We also need to change the <code>storageCleanup()<\/code> method as the generic WebDriver does not provide direct localStorage access:<\/p>\n<div>\n<div id=\"highlighter_657647\" 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<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">public<\/code> <code class=\"java plain\">TodoMvcTests(WebDriver driver) {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.driver = driver;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc = PageFactory.initElements(driver, TodoMvcPage.<\/code><code class=\"java keyword\">class<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">this<\/code><code class=\"java plain\">.todoMvc.navigateTo();<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java color1\">@AfterEach<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java keyword\">void<\/code> <code class=\"java plain\">storageCleanup() {<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">((JavascriptExecutor) driver).executeScript(<\/code><code class=\"java string\">\"window.localStorage.clear()\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>And now to change the browser type on runtime we need to adjust <code>sel.jup.default.browser<\/code> config property.<\/p>\n<p>One of the common ways to configure JUnit 5 and Selenium Jupiter is via Java system properties. This can be done programatically, with properties files but also by passing the properties directly to JVM with <code>-D<\/code> switch. To make sure that properties passed to JVM while executing Gradle are available in tests we need to modify <code>build.gradle<\/code> as presented below:<\/p>\n<div>\n<div id=\"highlighter_654687\" 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\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">test {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java comments\">\/\/ Make system properties available in tests<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">systemProperties System.getProperties()<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">useJUnitPlatform()<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">testLogging {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">events <\/code><code class=\"java string\">\"passed\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"skipped\"<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">\"failed\"<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>As of now, when you run command like <code>.\/gradlew clean test -Dprop=value<\/code>, the property <code>prop<\/code> will be available in tests.<\/p>\n<p>With the above change we can run the tests selecting browser type:<\/p>\n<div>\n<div id=\"highlighter_9780\" 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\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">.\/gradlew clean test --tests *TodoMvcTests -Dsel.jup.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">.browser=firefox<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Saving screenshots with Selenium Jupiter<\/h2>\n<p>Selenium Jupiter allows saving screenshots at the end of tests &#8211; always or only on failure. You can also customize the output directory and format.<\/p>\n<div>\n<div id=\"highlighter_721400\" 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\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">.\/gradlew clean test --tests *TodoMvcTests -Dsel.jup.<\/code><code class=\"java keyword\">default<\/code><code class=\"java plain\">.browser=firefox -Dsel.jup.screenshot.at.the.end.of.tests=<\/code><code class=\"java keyword\">true<\/code> <code class=\"java plain\">-Dsel.jup.screenshot.format=png -Dsel.jup.output.folder=\/tmp<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Tip: Consult the documentation for more options: <a href=\"https:\/\/bonigarcia.github.io\/selenium-jupiter\/#screenshots\">https:\/\/bonigarcia.github.io\/selenium-jupiter\/#screenshots<\/a><\/p>\n<h2 class=\"wp-block-heading\">Parameterized tests with JUnit 5<\/h2>\n<p>The general idea of parameterized unit tests is to run the same test method for different test data. To create a parameterized test in JUnit 5 you annotate a test method with <code>@ParameterizedTest<\/code> and provide the argument source for the test method. There are several argument sources available including:<\/p>\n<ul class=\"wp-block-list\">\n<li><code>@ValueSource<\/code> &#8211; provided access to array of literal values i.e. shorts, ints, strings etc.<\/li>\n<li><code>@MethodSource<\/code> &#8211; provides access to values returned from factory methods<\/li>\n<li><code>@CsvSource<\/code> &#8211; which reads comma-separated values (CSV) from one or more supplied CSV lines<\/li>\n<li><code>@CsvFileSource<\/code> &#8211; which is used to load comma-separated value (CSV) files<\/li>\n<\/ul>\n<p>In the next examples we will use the following CSV that is stored in the <code>src\/test\/resources<\/code> directory:<\/p>\n<div>\n<div id=\"highlighter_252735\" 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\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">todo;done<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">Buy the milk;<\/code><code class=\"java keyword\">false<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">Clean up the room;<\/code><code class=\"java keyword\">true<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">Read the book;<\/code><code class=\"java keyword\">false<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>In order to use the above CSV file in our test, we need to annotate the test with <code>@ParameterizedTest<\/code> annotation (instead of <code>@Test<\/code>) followed by <code>@CsvFileSource<\/code> annotation pointing to the file:<\/p>\n<div>\n<div id=\"highlighter_796411\" 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\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@ParameterizedTest<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java color1\">@CsvFileSource<\/code><code class=\"java plain\">(resources = <\/code><code class=\"java string\">\"\/todos.csv\"<\/code><code class=\"java plain\">, numLinesToSkip = <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">, delimiter = <\/code><code class=\"java string\">';'<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Creates Todo with given name\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createsTodo(String todo) {<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.createTodo(todo);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertSingleTodoShown(todo);<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Each record in the CSV file has two fields: <code>name<\/code> and <code>done<\/code>. In the above test only the name of the todo is used. But we can of course <strong>complicate<\/strong> the test a bit and use both properties:<\/p>\n<div>\n<div id=\"highlighter_539354\" 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<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java color1\">@ParameterizedTest<\/code><code class=\"java plain\">(name = <\/code><code class=\"java string\">\"{index} - {0}, done = {1}\"<\/code> <code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java color1\">@CsvFileSource<\/code><code class=\"java plain\">(resources = <\/code><code class=\"java string\">\"\/todos.csv\"<\/code><code class=\"java plain\">, numLinesToSkip = <\/code><code class=\"java value\">1<\/code><code class=\"java plain\">, delimiter = <\/code><code class=\"java string\">';'<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java color1\">@DisplayName<\/code><code class=\"java plain\">(<\/code><code class=\"java string\">\"Creates and optionally removes Todo with given name\"<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">void<\/code> <code class=\"java plain\">createsAndRemovesTodo(String todo, <\/code><code class=\"java keyword\">boolean<\/code> <code class=\"java plain\">done) {<\/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 plain\">todoMvc.createTodo(todo);<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertSingleTodoShown(todo);<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.showActive();<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertSingleTodoShown(todo);<\/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 keyword\">if<\/code> <code class=\"java plain\">(done) {<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.completeTodo(todo);<\/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\">assertNoTodoShown(todo);<\/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\">todoMvc.showCompleted();<\/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\">assertSingleTodoShown(todo);<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number19 index18 alt2\">&nbsp;<\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">todoMvc.removeTodo(todo);<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">assertNoTodoShown(todo);<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Please note, that multiple parameterized tests are allowed within the same test class\/<\/p>\n<p>Read more about parameterized tests in this article: <a href=\"https:\/\/www.javacodegeeks.com\/2017\/06\/cleaner-parameterized-tests-junit-5.html\">https:\/\/blog.codeleak.pl\/2017\/06\/cleaner-parameterized-tests-with-junit-5.html<\/a> but also go through the JUnit 5 documentation: <a href=\"https:\/\/junit.org\/junit5\/docs\/current\/user-guide\/#writing-tests-parameterized-tests\">https:\/\/junit.org\/junit5\/docs\/current\/user-guide\/#writing-tests-parameterized-tests<\/a><\/p>\n<h2 class=\"wp-block-heading\">Better assertions with AssertJ<\/h2>\n<p>JUnit 5 has a lot of built-in assertions but when the real work starts you may need much more than JUnit 5 has to offer. In such cases, I recommend AssertJ library. <a href=\"https:\/\/assertj.github.io\/doc\/\">AssertJ<\/a> <em>AssertJ is a Java library providing a rich set of assertions, truly helpful error messages, improves test code readability and is designed to be super easy to use within your favorite IDE.<\/em><\/p>\n<p>Some of the AssertJ features:<\/p>\n<ul class=\"wp-block-list\">\n<li>Fluent assertions on many Java types including Dates, Collections, Files etc.<\/li>\n<li>SoftAssertions (similar to JUnit 5\u2019s assertAll)<\/li>\n<li>Complex field comparison<\/li>\n<li>Can be easily extended &#8211; custom conditions and custom assertions<\/li>\n<\/ul>\n<p>To use AssertJ in a project, we need to add a single dependency to <code>build.gradle<\/code>:<\/p>\n<div>\n<div id=\"highlighter_212950\" 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\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">testCompile(<\/code><code class=\"java string\">'org.assertj:assertj-core:3.13.2'<\/code><code class=\"java plain\">)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>To get started, we need to statically import <code>org.assertj.core.api.Assertions.*<\/code> and use the code completion with <code>assertThat<\/code> method: <code>assertThat(objectUnderTest).<\/code><\/p>\n<p>For example, you would write <code>assertThat(todoMvc.getTodosLeft()).isEqualTo(3);<\/code> with AssertJ instead of <code>assertEquals(3, todoMvc.getTodosLeft());<\/code> in plain JUnit 5 or <code>assertThat(todoMvc.todoExists(readTheBook)).isTrue()<\/code> instead of <code>assertTrue(todoMvc.todoExists(readTheBook))<\/code>.<\/p>\n<p>Working with complex types is even better:<\/p>\n<div>\n<div id=\"highlighter_729695\" 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\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">todoMvc.createTodos(buyTheMilk, cleanupTheRoom, readTheBook);<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">assertThat(todoMvc.getTodos())<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.hasSize(<\/code><code class=\"java value\">3<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">.containsSequence(buyTheMilk, cleanupTheRoom, readTheBook);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Visit the official documentation to learn more about AssertJ: <a href=\"https:\/\/assertj.github.io\/doc\/\">https:\/\/assertj.github.io\/doc\/<\/a><\/p>\n<p>Tip: Read more on integrating AssertJ with JUnit 5: <a href=\"https:\/\/blog.codeleak.pl\/2017\/11\/junit-5-meets-assertj.html\">https:\/\/blog.codeleak.pl\/2017\/11\/junit-5-meets-assertj.html<\/a><\/p>\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n<p>In this article I presented how you can utilize built-in features of JUnit 5 to improve your project configuration in terms of speed execution but not only. You also learned about improving the the project by utilizing certain Selenium Jupiter features.<\/p>\n<p>As it may look like a lot already, both JUnit 5 and Selenium Jupiter has much more to offer. Have a look at both projects docs and find out what else you can find useful for your current or future projects:<\/p>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/bonigarcia.github.io\/selenium-jupiter\/\">https:\/\/bonigarcia.github.io\/selenium-jupiter\/<\/a><\/li>\n<li><a href=\"https:\/\/junit.org\/junit5\/\">https:\/\/junit.org\/junit5\/<\/a><\/li>\n<\/ul>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Rafal Borowiec, 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.codeleak.pl\/2019\/12\/junit-5-and-selenium-improving-project.html\" target=\"_blank\" rel=\"noopener noreferrer\">JUnit 5 and Selenium &#8211; improving project configuration<\/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>Selenium is a set of tools and libraries supporting browser automation and it is mainly used for web applications testing. One of the Selenium\u2019s components is a Selenium WebDriver that provides client library, the JSON wire protocol (protocol to communicate with the browser drivers) and browser drivers. One of the main advantages of Selenium WebDriver &hellip;<\/p>\n","protected":false},"author":516,"featured_media":176,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[1936,287],"class_list":["post-100553","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-junit-5","tag-selenium"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JUnit 5 and Selenium - improving project configuration - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about Selenium WebDriver? Check our article explaining about additional capabilities of JUnit 5 that will reduce extra time\" \/>\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\/12\/junit-5-and-selenium-improving-project-configuration.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JUnit 5 and Selenium - improving project configuration - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Selenium WebDriver? Check our article explaining about additional capabilities of JUnit 5 that will reduce extra time\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.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-12-25T05:00:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.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=\"Rafal Borowiec\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/kolorobot\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rafal Borowiec\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html\"},\"author\":{\"name\":\"Rafal Borowiec\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/b1a0b2657d5dd2459806446ac66d2d52\"},\"headline\":\"JUnit 5 and Selenium &#8211; improving project configuration\",\"datePublished\":\"2019-12-25T05:00:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html\"},\"wordCount\":1568,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"keywords\":[\"JUnit 5\",\"Selenium\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html\",\"name\":\"JUnit 5 and Selenium - improving project configuration - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"datePublished\":\"2019-12-25T05:00:36+00:00\",\"description\":\"Interested to learn about Selenium WebDriver? Check our article explaining about additional capabilities of JUnit 5 that will reduce extra time\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/junit-logo-e1426444701180.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/12\\\/junit-5-and-selenium-improving-project-configuration.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\":\"JUnit 5 and Selenium &#8211; improving project configuration\"}]},{\"@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\\\/b1a0b2657d5dd2459806446ac66d2d52\",\"name\":\"Rafal Borowiec\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g\",\"caption\":\"Rafal Borowiec\"},\"description\":\"Software developer, Team Leader, Agile practitioner, occasional blogger, lecturer. Open Source enthusiast, quality oriented and open-minded.\",\"sameAs\":[\"http:\\\/\\\/blog.codeleak.pl\\\/\",\"http:\\\/\\\/pl.linkedin.com\\\/in\\\/borowiec\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/kolorobot\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/rafal-borowiec\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"JUnit 5 and Selenium - improving project configuration - Java Code Geeks","description":"Interested to learn about Selenium WebDriver? Check our article explaining about additional capabilities of JUnit 5 that will reduce extra time","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\/12\/junit-5-and-selenium-improving-project-configuration.html","og_locale":"en_US","og_type":"article","og_title":"JUnit 5 and Selenium - improving project configuration - Java Code Geeks","og_description":"Interested to learn about Selenium WebDriver? Check our article explaining about additional capabilities of JUnit 5 that will reduce extra time","og_url":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-12-25T05:00:36+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","type":"image\/jpeg"}],"author":"Rafal Borowiec","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/kolorobot","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Rafal Borowiec","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html"},"author":{"name":"Rafal Borowiec","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/b1a0b2657d5dd2459806446ac66d2d52"},"headline":"JUnit 5 and Selenium &#8211; improving project configuration","datePublished":"2019-12-25T05:00:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html"},"wordCount":1568,"commentCount":1,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","keywords":["JUnit 5","Selenium"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html","url":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html","name":"JUnit 5 and Selenium - improving project configuration - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","datePublished":"2019-12-25T05:00:36+00:00","description":"Interested to learn about Selenium WebDriver? Check our article explaining about additional capabilities of JUnit 5 that will reduce extra time","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/junit-logo-e1426444701180.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2019\/12\/junit-5-and-selenium-improving-project-configuration.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":"JUnit 5 and Selenium &#8211; improving project configuration"}]},{"@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\/b1a0b2657d5dd2459806446ac66d2d52","name":"Rafal Borowiec","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e24680b2ba3dfc13759acf6c1f125e54356bc533e0befe953fea365cadcdaffb?s=96&d=mm&r=g","caption":"Rafal Borowiec"},"description":"Software developer, Team Leader, Agile practitioner, occasional blogger, lecturer. Open Source enthusiast, quality oriented and open-minded.","sameAs":["http:\/\/blog.codeleak.pl\/","http:\/\/pl.linkedin.com\/in\/borowiec\/","https:\/\/x.com\/https:\/\/twitter.com\/kolorobot"],"url":"https:\/\/www.javacodegeeks.com\/author\/rafal-borowiec"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/100553","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\/516"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=100553"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/100553\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/176"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=100553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=100553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=100553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}