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.
besmartand-pro/php-quality-config
sentix/ai-chatbot
codifyo/ts-generator-bundle
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor