DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Please enter at least three characters to search
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Zones

Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks

The software you build is only as secure as the code that powers it. Learn how malicious code creeps into your software supply chain.

Apache Cassandra combines the benefits of major NoSQL databases to support data management needs not covered by traditional RDBMS vendors.

Generative AI has transformed nearly every industry. How can you leverage GenAI to improve your productivity and efficiency?

Modernize your data layer. Learn how to design cloud-native database architectures to meet the evolving demands of AI and GenAI workloads.

Related

  • Organizing Knowledge With Knowledge Graphs: Industry Trends
  • Best Practices for Building the Data Pipelines
  • Discrepancies Between Test and FastAPI App Data
  • Mastering Database Unit Testing: A Full Guide and 5 Essential Tools

Trending

  • Optimizing Software Performance for High-Impact Asset Management Systems
  • Designing AI Multi-Agent Systems in Java
  • A Guide to Using Amazon Bedrock Prompts for LLM Integration
  • Knowledge Graph Embeddings and NLP Innovations
  1. DZone
  2. Data Engineering
  3. Databases
  4. The Magic Testing Challenge: Part 2

The Magic Testing Challenge: Part 2

By 
Thomas Mauch user avatar
Thomas Mauch
·
May. 23, 23 · Interview
Likes (1)
Comment
Save
Tweet
Share
4.9K Views

Join the DZone community and get the full member experience.

Join For Free

My last article raised an interesting discussion whether you should see tests more as documentation or more as specification. I agree that they can contribute to both of them, but I still think tests are just - tests...

There were also complaints about my statement that testing often becomes tedious work which nobody likes. Also here I agree, that techniques like TDD can help you to structure your code and make sure you code exactly what is needed by writing the tests, but the result of the process will still be a class which needs to be tested somehow.

So I have set up another small challenge to show how the visual approach featured by MagicTest helps to make testing a breeze. As you know, traditional assertion-based test frameworks like TestNG or JUnit force us to include the expected results in the test code. Where this may be more or less suitable for simple tests (like in the previous article), it quickly becomes cumbersome if the test handles complex objects or voluminous data.

The Task

We must test the method createEvenOddTable() (see appended ) with the following functionality:

  • Create HTML table (elements table, tr, td) with specified number of data rows and columns.

  • An additional row will be added to store header information (element th).

  • An additional column will be added which contains the row number (element th)

  • The rows will have attribute class set to "head", "even", or "odd" for easy styling.

Both the specification (the 4 lines above) and the source code itself (25 lines) are short and simple to understand, so any experienced developer will write this method in a few minutes. So what's the problem with testing this method? We will see if we look at how MagicTest handles this case.

The Magic Test

The MagicTest for this method looks like this:

public class HtmlTableTest {

	@Trace
	public void testCreateEvenOddTable() {
	    HtmlTable.createEvenOddTable(4, 3);
	}

	@Formatter(outputType=OutputType.TEXT)
	public static String formatElement(Element elem) {
	    XMLOutputter serializer = new XMLOutputter();
	    serializer.setFormat(Format.getPrettyFormat());
	    return serializer.outputString(elem);
	}
}

Some details:

  • We use the @Trace annotation to automatically capture information about calls to the method under test.

  • We rely on naming conventions, so the method HtmlTable.createEvenOddTable() is tested by HtmlTableTest.testCreateEvenOddTable().

  • Per default, MagicTest uses the toString() method to report the parameter and return values. As the Element's toString() method returns only its name, we have to define a custom @Formatter to get the full XML tree.

If we run the test, we get the following report:


If we look at the XML element tree in the report, we can see all the details which a complete test should cover: correct nesting of elements (table, tr, td), correct header line, correct line numbers, correct number of rows, correct number of cells for each row, correct class attribute for each row, etc.

But even if you end up with a bunch of lengthy assert statements like

	    assert("head".equals(((Element) elem.getChildren("tr").get(0)).getAttributeValue("class")));

which tests for the correct class attribute, this will not be enough: you should also test the absence of the class attribute for all cells except the first ones in each row. So yes, for a sound test you must actually verify the whole XML tree - and this is exactly the information which MagicTest shows you for confirmation.

Let the Challenge Begin

To run the test yourself, you will need to download the MagicTest Eclipse plug-in. Copy it into the Eclipse dropins folder and restart Eclipse. Then download the attached Eclipse project and import it into your workspace. Run the test class TagsTest by executing Run As / MagicTest.

After the first run, the test report will show up and all test steps will be red. This is the MagicTest way of telling you that a step has failed. In our case, the steps just fail because MagicTest simply does not know anything about the expected result. So we carefully check the output and confirm its correctness by clicking on the save button. Now all steps are green - and the test is successful.

You have now seen how efficiently this test can be realized using MagicTest - it even looked like fun. Does your test tool accept the challenge? How many minutes and lines does it take you to write the test? I'm looking forward to your contributions!

Appendix: Listing HtmlTable

	/**
	 * Create HTML table (elements table, tr, td) with specified number of data rows and columns.
	 * An additional row will be added to store header information (element th).
	 * An additional column will be added which contains the row number (element th)
	 * The rows will have attribute class set to "head", "even", or "odd" for easy styling.
	 *
	 * @param rows	number of rows
	 * @param cols	number of column
	 * @return		XML element containing the HTML table
	 */
	public static Element createEvenOddTable(int rows, int cols) {
		Element table = new Element("table");
		for (int r=0; r<rows+1; r++) {
			Element tr = new Element("tr");
			table.addContent(tr);
			String trClass;
			if (r == 0) {
				trClass = "head";
			} else {
				trClass = (r%2==1) ? "even" : "odd";
			}
			tr.setAttribute("class", trClass);
			for (int c=0; c<cols+1; c++) {
				String tdElem;
				if (r == 0) {
					tdElem = "th";
				} else {
					tdElem = (c==0) ? "th" : "tr";
				}
				Element td = new Element(tdElem);
				tr.addContent(td);
				if (c == 0 && r > 0) {
					td.setText(Integer.toString(r));
				}
			}
		}
		return table;
	}


Testing Database

Opinions expressed by DZone contributors are their own.

Related

  • Organizing Knowledge With Knowledge Graphs: Industry Trends
  • Best Practices for Building the Data Pipelines
  • Discrepancies Between Test and FastAPI App Data
  • Mastering Database Unit Testing: A Full Guide and 5 Essential Tools

Partner Resources

×

Comments
Oops! Something Went Wrong

The likes didn't load as expected. Please refresh the page and try again.

ABOUT US

  • About DZone
  • Support and feedback
  • Community research
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 100
  • Nashville, TN 37211
  • support@dzone.com

Let's be friends:

Likes
There are no likes...yet! 👀
Be the first to like this post!
It looks like you're not logged in.
Sign in to see who liked this post!