Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Junit Merger Laravel Package

sweetchuck/junit-merger

Merge multiple JUnit XML report files into a single combined report. Useful for aggregating test results from parallel jobs, multiple test suites, or split CI runs into one JUnit-compatible XML output.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require sweetchuck/junit-merger
    

    Add to composer.json under require-dev if only needed for testing:

    "require-dev": {
        "sweetchuck/junit-merger": "^2.0"
    }
    
  2. First Use Case Merge two JUnit XML files (e.g., from parallel test runs):

    use Sweetchuck\JUnitMerger\JUnitMerger;
    
    $merger = new JUnitMerger();
    $mergedXml = $merger->merge([
        'path/to/test-results-1.xml',
        'path/to/test-results-2.xml'
    ]);
    file_put_contents('merged-results.xml', $mergedXml);
    
  3. Key Files

    • src/JUnitMerger.php: Core logic.
    • tests/: Example usage and edge cases.

Implementation Patterns

Workflows

  1. Parallel Test Merging Use in CI/CD pipelines to combine JUnit reports from parallel test workers:

    $files = glob('parallel-results/*.xml');
    $merged = $merger->merge($files);
    
  2. Pre-Commit Hooks Integrate with PHPUnit’s --log-junit to merge test results before upload:

    $phpunitXml = 'phpunit.xml';
    $merged = $merger->merge([$phpunitXml, 'custom-rules.xml']);
    
  3. Dynamic File Handling Stream large files or remote reports (e.g., from GitHub Actions artifacts):

    $remoteXml = file_get_contents('https://example.com/results.xml');
    $merged = $merger->merge([$remoteXml, 'local.xml']);
    

Integration Tips

  • Laravel Testing: Use with phpunit.xml to merge test suites:

    <phpunit ...>
        <log>merged-results.xml</log>
    </phpunit>
    

    Then merge in phpunit.xml.dist:

    $merger->merge(['tests/Unit/*.xml', 'tests/Feature/*.xml']);
    
  • CI/CD Scripts: Add to .github/workflows/tests.yml:

    - name: Merge JUnit reports
      run: |
        php vendor/bin/php junit-merger-cli merge results/*.xml > merged.xml
    

Gotchas and Tips

Pitfalls

  1. Duplicate Test IDs If tests share the same id or name, the merger may overwrite results. Ensure unique test IDs in parallel runs:

    // Example: Prefix test classes in parallel workers
    class ParallelTest extends TestCase {
        public function testExample() {
            $this->assertTrue(true);
        }
    }
    
  2. XML Validation Invalid XML (e.g., malformed tags) will crash the merger. Validate inputs:

    $xml = simplexml_load_string($xmlContent);
    if ($xml === false) {
        throw new \RuntimeException("Invalid JUnit XML");
    }
    
  3. Memory Limits Large files (>10MB) may hit PHP’s memory_limit. Stream files or use fopen:

    $merged = $merger->merge([fopen('file1.xml', 'r'), fopen('file2.xml', 'r')]);
    

Debugging

  • Verbose Output: Enable debug mode to log merged content:

    $merger = new JUnitMerger(['debug' => true]);
    
  • Dry Runs: Check merged output without saving:

    $mergedXml = $merger->merge(['file1.xml', 'file2.xml']);
    echo $mergedXml; // Inspect before saving
    

Extension Points

  1. Custom Merging Logic Override the merge() method to handle edge cases (e.g., custom test attributes):

    class CustomMerger extends JUnitMerger {
        protected function mergeTestCases(array $testCases): array {
            // Custom logic here
            return parent::mergeTestCases($testCases);
        }
    }
    
  2. Post-Merge Processing Use events to transform the merged XML (e.g., add metadata):

    $merger->on('afterMerge', function ($mergedXml) {
        $dom = new \DOMDocument();
        $dom->loadXML($mergedXml);
        // Add custom nodes
        return $dom->saveXML();
    });
    
  3. CLI Integration Pair with sweetchuck/junit-merger-cli for non-PHP workflows:

    junit-merger merge input1.xml input2.xml > output.xml
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
nasirkhan/laravel-sharekit
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony