XML Europe 2004 logo

Test-driven XML Development: Building Rapid Change Management into XML Systems

Abstract

This paper is a forward-thinking look at the application of test-driven development within the XML processing space.

Ever since Extreme Programming popularized the idea of test-driven development within software development processes, developers in virtually every modern programming language have been reaping the benefits of improved code quality and drastically reduced risk and cost for making changes to existing code. Thus providing their companies, products, and customers with more consistent quality on tighter time-lines. This paper takes this development and testing philosophy in a new direction: XML.

XML-based development projects have many unique risks and costs. DTDs & Schemas are the cornerstone of an XML system. They define the structural constraints that the rest of the system relies on. Frequently changing DTDs/Schemas can ripple changes throughout a system from stylesheets to storage to remediation of all of the content. This paper looks at the parallels between software and XML-based development and shows how these risks can be dramatically reduced via the proper application of test-driven development processes.

This paper addresses how to leverage key XML technologies with open source software tools to automate testing of XML development, including: XSLT development, DTD/Schema changes, and automated XML validation. Strengths and weaknesses of this approach are analyzed, based on real world experience. It also provides assistance in developing a 'test-driven' mindset, pertinent to XML tools and development processes.

This paper provides developers with key information for integrating characteristics of test-driven development into their own processes. The provided breakdown of costs and benefits will help managers evaluate, and potentially improve, the quality of their own XML-development processes. Thus reaping the benefits of automated XML-based testing and minimizing the defined risks.

Keywords


Table of Contents

1. Introduction
2. Risk Scenario 1: Large Scale Structural & Sample Integrity
3. Risk Scenario 2: Complexities with XSL Stylesheet Testing
4. Risk Scenario 3: Choosing the Right Weapon
5. Results & Conclusions
6. Appendix
6.1. Background Information
6.2. Known Limitations of Automated Unit Testing
Acknowledgements
Bibliography
Biography

1. Introduction

Hello World!

For many of us, these words have become synonymous with illustrating key concepts and processes with the intent of improving your understanding and making your efforts more effective than they otherwise would be.

It is the intent of this paper to illustrate and pass on to you an understanding of some new key concepts and processes that may indeed change the way you think about and develop XML, DTDs, stylesheets, and related systems.

In some ways, this paper has been many years in the making. Many years ago the author of this paper was brought in to help develop a hyper-document link-aware SGML-based content management system. Led by notable industry figures, Eliot Kimber (XML, HyTime, XTM, XSL:FO) and John Heintz (a skilled OO architect, database and versioning expert), this project developed a reference implementation of what I still believe to be the most advanced and complete implementation of versioning semantics and cross-document hyperlinking to date [SnapCM]. It was an intense learning experience developed on a tight time-line. The end result was a code-base that was well architected, robust, and upon which large-scale re-implementations and code changes could be performed without hesitation.

Aside from the commitment and technical expertise of the development team, one of the keys to making this large system so easy to change was the development methodology we followed: Extreme Programming (XP)[XP]. This paper is not about Extreme Programming. However, it is about one of the fundamental aspects of XP that transcends the development philosophy: automated test frameworks. Over his subsequent markup standards-centric career, the author of this paper has learned that the benefits of driving your development processes with an automated 'test first' mindset can extend far beyond its origins with object oriented programming languages.

This is also a paper of the risks inherent in XML-based systems. Several of these fundamental risks will be identified and examined. An approach to applying test-driven development to mitigate each risk, enabling higher quality and rapid change will be presented. When applicable, current open source tools and technologies for that type of testing will be discussed. The strengths and weaknesses will be analyzed. Discussion of the potential cost savings of using that approach will also be discussed.

This set of risk mitigation approaches represent several of the author's experiences with applying test-driven processes to XML-based systems. It is the hope of the author that these processes will become accepted and eventually mainstream to development of XML systems, thus improving the quality, consistency, profitability, and user satisfaction of tools and systems within the XML family of standard specifications.

For those readers who are unfamiliar with automated unit testing, please refer to the Appendix to learn:

  • detailed background information on both unit testing and the 'test-first' mindset

  • benefits of test-driven development processes

  • limitations of unit testing

2. Risk Scenario 1: Large Scale Structural & Sample Integrity

Fundamentally, XML documents consist of hierarchically-organized text data encoded in a standard encoding, such as Unicode Transformation Format 8-Bit encoding (UTF-8) [UTF]. The backbone of an XML system is the Document Type Declaration (DTD) [DTD]or Schema (W3C[W3C Schema] or RelaxNG[RelaxNG]). The DTD or Schema(s) provide the structural constraints against which an arbitrary document of that type can be validated.

Validation of XML documents against a corresponding DTD/Schema is a critical aspect of nearly any XML-related product or process. When XML documents are loaded by authoring tools, they are validated. When XML documents are imported or exported from a database, the data should be validated. Before a user-defined XML configuration document is applied to define and set web application server features, it should be validated.

Typically the DTD/Schema is used when defining the Stylesheet transformations used to convert, render for view, or otherwise output an XML document. Often times the DTD/Schema is also involved in how the underlying data repository stores and retrieves XML documents and their content. DTDs/Schemas are indeed the cornerstone of an XML solution.

Large scale systems can contain dozens of DTDs/Schemas and tens to hundreds of millions of documents. The side effects of change in systems of this scale can be traumatic and catastrophic. The net effect of changes to the DTDs and Schemas ripple changes throughout all of the mentioned system dependencies and more. Every time the DTD/Schema changes, the tens of millions of documents depending on them need to be updated for validity.

How do you mitigate risk of document-structural changes in systems of this scale? It has been this author's experience that you can help reduce the impact of these changes by setting up an XML-based automated testing framework. When the DTDs/Schemas are initially authored, they should be authored alongside a set of sample XML test documents. These test documents should minimally exercise the significant structural paths defined by the corresponding structures. An automated testing framework can be setup to individually test validation of each of these sample documents. Any time the DTD or Schema changes, this test suite can be executed providing detailed information on the location and nature of the changes. To take this one step further, a document conversion agent could be created along with an XSLT[XSLT] stylesheet to automate the transformation necessary to update the data with the corresponding DTD changes. The agent can be tested against the sample documents. Once the kinks are ironed out, systematic updates to the millions of corresponding XML documents can be performed.

The following graphic illustrates the expected sequence of operations for a 'test-first' DTD-authoring XML validation test suite when no DTD changes have been made. In this situation, running the test suite should result in a visual indication of all tests passing.

click image for full size view

The following graphic illustrates the expected sequence of operations for the same 'test-first' DTD-authoring XML validation test suite. When the DTD is updated and/or changed, the sample documents should be updated first. The DTD changes are then made. The test suite is executed, visually indicating the success and failures of the individual validation tests. The test samples, DTD, and tests themselves are updated and retested until all of the tests pass, confirming that you have an automated way to confirm the DTD and samples are up to date. As previously mentioned, a stylesheet could be written and tested during this process to help automate the application of the content changes for the actual production data.

click image for full size view

The end result (of this sequence) is updated sample content, successful DTD changes in a demonstrable way, and a start on a stylesheet that can be used to automate updates to the production information. Any time the DTD changes in the future, this suite of tests can be run to detect and repair content side-effects of those changes. Conceptually the process is simple and straightforward. In practice, the stylesheet for automating changes should be developed before the remediation of failed validation tests takes place. Thus, your sample data should help you find flaws in your stylesheet as well.

What open source tools are available to help? Any programming language or a build tool (such as Apache Ant[Ant]) that has programmatic access to a decent XML parser and stylesheet transformation engine can be used to automate the validation and processes mentioned above. Most popular programming languages also have an open source unit testing framework (such as JUnit[JUnit]) available that can be leveraged. Automated validation testing should be integrated into most XML-related projects. Nearly any unit testing programming language tool can be used for the task. Include a validation test for every sample and test XML document that you use. Separate each validation into a unit of testing, so they are quickly identifiable.

The cost of implementing this approach is the cost of adequately developing and maintaining comprehensive sample XML documents and corresponding validation tests for your DTD. Each time your DTD changes, the cost of maintaining your test suite is nearly linear. While the cost of implementing this approach is estimable in man-hours, the total cost savings is a more complex equation.

The total cost savings include rapid detection and reduction in the rippling side-effects from each change. Thus decreasing the 'mystery' time of hunting down and determining the source of failures. This 'mystery tracking' time is typically greater than the linear time spent to simply update a test for a particular change. The time necessary to enact or react to content or structural changes will be minimized. The time spent to setup a test suite process that helps enable the automated update of content is much lower than the time and cost of manual conversion of an arbitrarily large number of production XML documents. The more frequently your DTDs change combined with the more complex of a system in terms of DTD-based dependencies, the greater the total time and cost savings should be.

The most frequent counter-arguments to this approach revolve around the misconception that the effort necessary to properly automate a test-first suite is unnecessary effort or that it adds time to your development schedule. When you calculate the total cost savings, not just those immediately apparent, the savings over the total life-cycle of a project can be significant.

3. Risk Scenario 2: Complexities with XSL Stylesheet Testing

Extensible Stylesheet Language Transformations (XSLT)[XSLT] is quite interesting from a technology perspective. Who'd have thought that a recursive, templatized processing language whose limitations are compensated for with what are essentially XPath[XPath] 'goto's, would be the chosen technology format for performing complex XML to XML transformations. Despite these interesting design choices, XSLT is an immensely useful language that has been widely accepted and supported as the 'standard' way for performing XML transformations to XML or another markup language.

These rather unique design decisions have created, likewise, unique technical risks, not the least of which is how to adequately guarantee the output quality of large, complicated sets of transforms to a set of output formats. The logical answer to this would seem to be through 'adequate testing'.

So how do you 'adequately test' XSLT output? One set of testing options is common to transformations whose output is to a more human-friendly viewable format than XML, such as an XSLT transform to HTML or similarly an XSL Formatting Object (XSL:FO)[XSL:FO] transform that eventually becomes PostScript (PS) or Portable Document Format (PDF). In these situations, it is possible to run the transformation on a set of test documents and visually check every single detail of the output. Every time the transformation templates change, you have to visually check the output again. If the change rippled side-effects, you might not know unless you visually check every detail of the output again. Tools are available to help with this type of testing, however the fundamental flaws and time consumption caused by repeated extensive manual visual examination (not to mention human error) remain significant.

Those lucky individuals who are writing transformations to XML or less-visually appealing output formats have an even harder time doing this visual output checking. While visual HTML/PDF output may be an egregious (yet acceptable) testing method in some cases, a better solution must exist to support this other category of transformation. Further complicating the matter is the wide range of persons capable of implementing XSLTs or XSL:FOs on a regular basis. Due to the aforementioned design decisions, expert XSLT implementers don't need a Computer Science degree and don't have to be familiar with good programming practices in order to be proficient in writing transforms. This increases the acceptance, adoption, and number of candidates capable of using XSLT/FO. However, as we will see below, it can also have some negative side-effects.

A couple of open source tools exist to support automated unit testing of XSLT stylesheets. Perhaps the most notable and widespread is XSLTunit[XSLTunit] testing framework. The premise behind XSLTunit is simple and admirable. Write more XSLT to test XSLT. XSLTunit provides templates and the vocabulary in the XSLTunit namespace to perform assertions and other testing on the results of a transformation. There are a couple of potential drawbacks to using XSLTunit. First, the verbosity required to author your tests in XSLT seems excessive. It may be an acceptable format for apply testing in clever ways by experienced software engineers or computer scientists. However, this leads us back to the wide potential user base for XSLT authors. Many of the experienced stylesheet authors this author knows are Information Systems majors and are not versed in fundamental computer science programming concepts or best practices. This may not be a universal truth, but these authors, while experts at XSLT development, would not have the time or patience to implement more XSLT to test their stylesheets. That is the unfortunate truth.

Another notable open source tool to assist with XSLT unit-based testing is XMLUnit[XMLUnit]. XMLUnit is a Java programming language (also available for .NET) implemented toolkit for unit testing of XML documents. It includes some unique features, such as the ability to perform assertions on output of transformations and XML-based differencing (diff) functionality. The toolkit supports use of the Transformation API for XML (TrAX[TrAX]) and should be usable with any conformant DocumentBuilder, TransformerFactory, etc... The toolkit ships tested and configured for use with Apache Xerces-J[Xerces]/Xalan-J[Xalan]. If you try to configure other TrAX-compliant combinations, you can get some strange results. For instance, the AElfred[AElfred] parser used with the Saxon[Saxon] transformation engine isn't validating. Thus some features (including the tests that ship with XMLUnit) will not work when configured with the typical Saxon installation. For those users whose stylesheets require use of extension functions from other transformation engines, XMLUnit's transformation support is of little use. That constraint aside, the toolkit has some very helpful features.

Back to the problem at hand... How do you adequately test an XSL transformation? This author recommends a home-brewed approach to stylesheet testing.

Fundamentally XSLT is composed primarily of templates that match for certain elements and perform operations and specify output based upon context. 'Goto'-like navigation to siblings or other arbitrary document locations is possible with XPath expressions. There are many more advanced features and functions, but typically a sample XML document is processed by a stylesheet matching its elements in a recursively descending fashion. Thus templates are logical points for units of testing. The context of the match within a sample document, along with the matched element's subtree provide the test inputs. The various output paths for a given template and its expected recursively matched subtree (as defined/expected by examination of the DTD/Schema) provide the expected output for the input. Therefore a test suite can consist of a sequence of these template subtree tests that are combined to exercise the various significant combinations of subtree input. The tests themselves can have output comparisons against the sets of expected outputs for those input variations.

For large scale systems with frequently-changing stylesheets that contain complex, multilevel, recursive sorting of multi-language documents with context-specific output conditions and other various ugliness due to either poor structural (DTD/Schema) design choices (such as semantic tables) or restrictive business rules, this type of low-level unit testing solution can be very intensive and manually labor intensive. This is less a side-effect of the solution as of the overall complexity of the problem, going all the way back to the aforementioned interesting design decisions.

The compromise is to define your unit-based template tests to significant subtrees. Using the 80-20 rule as a guide [Pareto's Principle], focus on thoroughly testing the 20% of the templates that contain the 80% (majority) of the complexity. This takes a good deal of experience and discretion. However, the benefit of automatically being able to do regression testing on a set of stylesheets and confirming that the majority of the complexity is still providing the expected output is a huge benefit over the alternatives. Calculating the cost to setup and maintain an automated, comprehensive stylesheet testing framework versus recovery time upon system failure, perpetual stylesheet 'fixes', and eventual customer dissatisfaction is left as an exercise for the reader. Do you really need a calculation?

Good decision-making while defining the boundaries of problems to be solved in extension functions versus within the stylesheet itself can further simplify the problems. There are many problems you can encounter during transformation for which XSLT is not necessarily the ideal implementation language [Things XSLT can't do]. Advanced mathematical calculations and non-trivial string manipulations are candidate situations where extension functions may be a better choice for the solution. Thus the types of processing that aren't good within the constraints of a recursive process can be implemented in a real programming language with more typical unit-based testing.

Additional benefits can be leveraged from utilizing all of the tools at your disposal. Perhaps the output can more appropriately be tested in slices, via XPath. Perhaps a robust test against an in-memory model DOM will decrease the number and complexity of your test documents. Perhaps writing XSLT to test your XSLT with XSLTUnit is right for your situation. The next section looks at these additional areas of test application with common XML processing models and open source tools.

4. Risk Scenario 3: Choosing the Right Weapon

The XML family of standards has opened up the potential to realize many dimensions of implementation, that before were just ideas. Thanks in part to its inheritance from SGML and the efforts, analysis, and lessons learned by XML's forefathers, advanced systems composed of subsets of features including single-source, multi-output, multi-language publications taking advantage of cross-document linking and reuse with time-based version resolution are now a reality that is much more accessible than ever before.

With few exceptions, regardless of the XML system or solution, this author stands behind the belief that a test-driven mindset and automated unit testing processes can provide some benefits. It won't always be the ideal testing solution. However, it can be effectively applied to a far wider context than has been discussed in this paper.

This section describes the usage of other XML technologies to assist with automated testing. SAX[SAX] and DOM[DOM] are frequently used within XML processing scenarios and tools. DOM-based comparisons can provide your unit tests with comprehensive in-memory document models for detailed testing. XPaths can be integrated into unit tests to evaluate path expression results against expected node sets. Using a series of XPath statements separated into several unit test cases that take actual output as an argument and compare it to the evaluation of the test set of corresponding 'expected' XPath expressions with complementary code to support result comparison, you have a quick way to minimally test small sets of transformations.

Various implementations of XML processors and transformation engines also have additional features, extensions, and configurations that, while proprietary, can still be leveraged for testing. With all of the available choices for testing, pairing the correct testing metaphor and processes with the correct problem scenario can be a daunting task. However, experience is a great teacher and (in this author's opinion) some testing is always better than none!

This paper has taken a detailed look at several applications of XML-based automated unit testing for validation and transformations as well as DOM/SAX testing. However, large scale customer and tool integration requirements can often dictate harsh conceptual and implementation implications. Unit testing can be harnessed to help minimize the risk associated with many of these larger issues as well. Many more complex issues exist that can complicate your ability to unit test. Research, common sense, ingenuity, and a determination to automate your testing can help you find solutions to many, but not all of these problems.

5. Results & Conclusions

Automated test-driven development processes can provide many key benefits to your XML systems. This paper has provided guidance on where and how those processes can be utilized to provide time, cost, and maintainability benefits. Unit testing can be leveraged for automated validation for any number of document types and related documents. Unit testing can provide granular and accurate confirmation that many, if not all, of the XSL transformations in your system are working properly. XPath can be leveraged in unit tests to quickly test slices of document content. Likewise, DOM can be leveraged as an in-memory model for granular, detailed document comparisons. Open source testing frameworks, such as JUnit, XSLTUnit, or XMLUnit can be utilized to help as needed. Open source XML parsers and XSLT processors, along with their specialized features and enhancements, can and should be used to support your testing efforts.

Automated unit testing can and should be used on most XML-related projects regardless of other development process details. Key to the successful integration of test-driven development in projects is development of the appropriate developer mindset: Test everything and you will become empowered. Hello World!

6. Appendix

6.1. Background Information

Traditional 'unit testing' is a way of breaking down testing of large systems into very granular pieces or 'units' of testing. Often each method in a particular software code class will have a corresponding unit test. This unit test provides a sequence of meaningful and interesting inputs to that method. Assertions are performed on outputs to confirm that the desired result for each input is received. Often unit tests are also inclusive of inputs resulting in testable desired failure conditions. This complete set of unit tests for a method provide a 'contract' that serves two purposes. First, it exhaustively tests all of the significant functionality of that method in a repeat-testable way. Second, it clearly indicates to future developers what the intent of the code was. When consistently applied, unit tests ensures that maintainability is greatly increased.

The sets of unit tests for each significant method within a class are combined (in sequence) with tests for the significant methods within its package, project, and code modules throughout a code-base. An executable way of running these individual unit tests in sequence is provided. At any point in time the entire 'test suite' can be executed, confirming that the entire code-base is working as expected. Addition of new code modules as well as refactorings of existing code modules can be performed with confidence, as unexpected 'rippling' failures can be quickly detected and repaired.

Key to the success of unit testing is the development mindset that it entails. When the unit tests for a class are developed prior to the actual code development, this is referred to as a 'test first' mindset. The 'test first' mindset is very beneficial to development processes. Developing tests first ensures that a developer has completely thought through the desired inputs, outputs, and failures of a piece of code before beginning to write that code. Ideally, once the code itself is completed, the corresponding tests can simply be run against that code and confirm it works as initially expected. Logic and implementation failures within that code can be detected and fixed immediately after the code is completed. Next, the unit tests are integrated into and tested with the full test suite to confirm that no other code was broken as a result of this code. Additionally, the ability to properly unit test a piece of code will often dictate a particular 'good practice' implementation that might not be obvious at first. Writing unit testable code often results in more modular, testable, and extensible code-bases.

When all of these factors are combined, the reality of 'test-driven' development is realized. Code is better designed, more testable, more stable, and is documented via corresponding unit tests. Large scale refactorings can be performed that otherwise would have previously terrified a knowledgeable developer. At any time the successful operation of the entire code-base can be tested and demonstrated. Properly implemented test-driven processes can enable rapid change management within software systems. The initial cost is the time to adequately test each piece of code. The cost savings over the life of the code can be tremendous.

Having a large code-base of unit testable code that can be automatically run to verify an entire code-base is working is liberating. Many fundamental problems that software developers face can be eliminated thanks to unit testing. No longer are code-bases fragile beings, held together with shoe strings and gum. Unit testing allows large code refactorings to take place that were otherwise nearly impossible. If a change you make breaks code, you see tests failing. You fix the code where those tests fail, and theoretically you can enact large-scale code changes while maintaining a nearly bug-free code-base. No longer will developers be afraid to look at or change each other's code, as the testing framework should provide a detailed coded description of what each method in each class is supposed to do. It is clearly documented in the test code far more clearly than any programmer comments that you'd be likely to find. Unit testing promotes a 'can do' development attitude.

Unit testing is very data and process driven. Any data classes, structures or objects that you create in your code-base can and should have corresponding unit tests. Many developers may share common objects. Future code changes by another developer, should have additional tests written to identify new and changing behavior.

6.2. Known Limitations of Automated Unit Testing

Unit testing is not a 'Golden Hammer'[AntiPatterns] . User Interface (UI) testing is notoriously a very tedious and manual process with serious regression implications for even the most minor code changes. This is complicated by the need to simulate/emulate runtime user interaction. Several frameworks are available for various UI applications to assist with automating testing. Proper application of the Model View Controller[MVC] and other UI design patterns can ensure that the data models your UI relies on are testable. Often times, the control can also be unit tested with the assistance of a mock framework. Thus, ideally the amount of code not tested is minimized to the view and some of the control. However, at best, comprehensive automated UI unit testing is complex and can be problematic.

Enterprise-level applications can also provide many unique challenges to unit testing. This type of environment often requires that complex operational and environmental setups be running in order to perform testing. EJB and HTML templating frameworks are two examples of difficult applications to unit test. With EJBs you have beans, interfaces, and generated code within container environments that must be running to adequately test. While not solving all of your problems, many specialized unit testing frameworks have been developed to assist with testing for such applications.

Acknowledgements

Thanks to the original Isogen Bonnell team for being a continuing source of technical innovation and inspiration!

Bibliography

[Things XSLT can't do] "Things XSLT can't do", Dave Pawson, 2001-03, http://www.dpawson.co.uk/xsl/sect2/nono.html.

[UTF] "FAQ - UTF and BOM", Unicode, Inc., 1991-2004, http://www.unicode.org/faq/utf_bom.html#2

[DTD] "DTD Tutorial", Refsnes Data, 1999-2004, http://www.w3schools.com/dtd/default.asp

[W3C Schema] "XML Schema", W3C, 2000-03, http://www.w3.org/XML/Schema

[RelaxNG] "Relax NG Specification", The Organization for the Advancement of Structured Information Standards [OASIS], 2001, http://www.oasis-open.org/committees/relax-ng/spec-20011203.html

[XSLT] "XSL Transformations (XSLT)", W3C Recommendation, 1999, http://www.w3.org/TR/xslt

[XSL:FO] "XSL Formatting Objects (Part of XSL Recommendation)", W3C Recommendation, 2001, http://www.w3.org/TR/xsl/

[SnapCM] "SnapCM: Versioning Object Model", Heintz, J., Reynolds, J., http://www.isogen.com/papers/snapCM.pdf

[XP] "Extreme Programming: A Gentle Introduction", Wells, D., 1999-2001, http://www.extremeprogramming.org/

[SAX] "Simple API for XML (SAX)", http://www.saxproject.org

[DOM] "Document Object Model (DOM) Level 2 Core Specification", W3C Recommendation, 2000, http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1590626202

[XML] "Extensible Markup Language (XML) 1.0", W3C Recommendation, 1998, http://www.w3.org/TR/1998/REC-xml-19980210

[XPath] "XML Path Language (XPath) 1.0", W3C Recommendation, http://www.w3.org/TR/xpath

[Ant] "Apache Ant", Apache Software Foundation, 2000-04, http://ant.apache.org/

[Xerces] "Xerces Java Parser", Apache Software Foundation, 1999-2001, http://xml.apache.org/xerces-j/

[Xalan] "Xalan-Java XSLT Processor", Apache Software Foundation, 2004, http://xml.apache.org/xalan-j/

[XMLUnit] "XMLUnit", http://xmlunit.sourceforge.net/

[XSLTunit] "XSLTunit", Van der Vlist, E., 2001-03, http://xsltunit.org/

[Saxon] "Saxon: XSLT and XQuery Processor", Kay, M., 2003, http://saxon.sourceforge.net/

[AElfred] "AElfred XML Parser", Kay, M., 2002, http://saxon.sourceforge.net/aelfred.html

[TrAX] "Transformation API for XML", Apache Software Foundation, 2004, http://xml.apache.org/xalan-j/trax.html

[Pareto's Principle] "Pareto's Principle - The 80-20 Rule", About, Inc., 2004, http://management.about.com/cs/generalmanagement/a/Pareto081202.htm

[MVC] "Design Patterns, Elements of Reusable Object-Oriented Software", Gamma, E., Helm, R., Johnson, R., Vlissides, J., Addison-Wesley Publishing Company, 1995.

[AntiPatterns] "AntiPatterns Refactoring Software, Architectures, and Projects in Crisis", Brown, W., Malveau, R., McCormick III, H., Mowbray, T., John Wiley & Sons, Inc., 1998.

[JUnit] “JUnit.org”, http://www.junit.org/index.htm

Biography

Software Systems Engineering Consultant
»Austin, Texas
»USA

Brandon Jockman is a software systems engineering consultant with many years of standards-based full life-cycle software systems development and integration experience. Brandon has extensive experience with development and integration of versioned-linking within distributed XML content management systems and authoring applications to meet intensive and exacting requirements. When not transforming standards-based visions into working designs, Brandon pursues technical interests in the realm of applying agile test-driven processes, patterns and anti-patterns to software and markup-related development.