{"id":15734962,"url":"https://github.com/llaville/phpunit-loggertestlistener","last_synced_at":"2025-07-15T17:33:29.500Z","repository":{"id":20077731,"uuid":"23346693","full_name":"llaville/phpunit-LoggerTestListener","owner":"llaville","description":"PHPUnit Test Suite listener for compatible PSR-3 logger","archived":false,"fork":false,"pushed_at":"2021-09-06T15:04:25.000Z","size":127,"stargazers_count":5,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-26T18:57:15.176Z","etag":null,"topics":["phpunit","phpunit-listener"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/llaville.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-08-26T09:42:42.000Z","updated_at":"2021-09-06T15:04:28.000Z","dependencies_parsed_at":"2022-07-08T07:00:41.889Z","dependency_job_id":null,"html_url":"https://github.com/llaville/phpunit-LoggerTestListener","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llaville%2Fphpunit-LoggerTestListener","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llaville%2Fphpunit-LoggerTestListener/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llaville%2Fphpunit-LoggerTestListener/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/llaville%2Fphpunit-LoggerTestListener/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/llaville","download_url":"https://codeload.github.com/llaville/phpunit-LoggerTestListener/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243357647,"owners_count":20277988,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["phpunit","phpunit-listener"],"created_at":"2024-10-04T01:05:49.235Z","updated_at":"2025-03-13T06:31:53.089Z","avatar_url":"https://github.com/llaville.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD013 MD046 --\u003e\n# PHPUnit Test Suite listener for compatible PSR-3 logger\n\n[![Latest Stable Version](https://img.shields.io/packagist/v/bartlett/phpunit-loggertestlistener.svg?style=flat-square)](https://packagist.org/packages/bartlett/phpunit-loggertestlistener)\n[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.1-8892BF.svg?style=flat-square)](https://php.net/)\n\n\nGoal is to provide a standard PHPUnit Listener that is capable to send unit test results\nto any PSR-3 compatible logger.\n\nThe listener implement the `PHPUnit\\Framework\\TestListener` interface,\nand used these log levels/events mapping.\n\n**ERROR**\n\n    - `addError()`, when an error occurred\n    - `addFailure()`, when a failure occured\n\n**WARNING**\n\n    - `addWarning()`, on warning test\n    - `addIncompleteTest()`, on incomplete test\n    - `addRiskyTest()`, on risky test\n    - `addSkippedTest()`, when a test was skipped\n\n**INFO**\n\n    - `startTest()`, when a test started\n    - `endTest()`, when a test ended\n\n**NOTICE**\n\n    - `startTestSuite()`, when a test suite started\n    - `endTestSuite()`, when a test suite ended\n\n## Installation\n\n**IMPORTANT**: For demonstration purpose, a Growl Handler and an AdvancedFilter Handler were used but are not yet available as a GitHub or Packagist version.\n\n```shell\ncomposer require bartlett/phpunit-loggertestlistener\n```\n\n\n## Usage with basic PSR-3 Logger\n\nWe will use a very basic PSR-3 logger for our first steps. Suppose we have such following implementation.\n\n```php\n\u003c?php\n\nuse Psr\\Log\\AbstractLogger;\n\nclass YourLogger extends AbstractLogger\n{\n    private $channel;\n\n    public function __construct($name = 'YourLoggerChannel')\n    {\n        $this-\u003echannel = $name;\n    }\n\n    public function log($level, $message, array $context = array())\n    {\n        error_log(\n            sprintf(\n                '%s.%s: %s',\n                $this-\u003echannel,\n                strtoupper($level),\n                $this-\u003einterpolate($message, $context)\n            )\n        );\n    }\n\n    protected function interpolate($message, array $context = array())\n    {\n        // build a replacement array with braces around the context keys\n        $replace = array();\n        foreach ($context as $key =\u003e $val) {\n            if (is_scalar($val)) {\n                $replace['{' . $key . '}'] = $val;\n            }\n        }\n\n        // interpolate replacement values into the message and return\n        return strtr($message, $replace);\n    }\n}\n```\n\n\nAdd in your `phpunit.xml` configuration file the `Bartlett\\LoggerTestListener` test listener,\nusing our basic PSR-3 logger (`YourLogger`).\n\n**Using default behavior of your logger**\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cphpunit\u003e\n    \u003clisteners\u003e\n        \u003clistener class=\"Bartlett\\LoggerTestListener\"\u003e\n            \u003carguments\u003e\n                \u003cobject class=\"YourLogger\" /\u003e\n            \u003c/arguments\u003e\n        \u003c/listener\u003e\n    \u003c/listeners\u003e\n\u003c/phpunit\u003e\n```\n\nWe can change name of the channel (from default `YourLoggerChannel` to value `YourPSR3Logger`) as follow :\n\n**Configure the channel name of your logger**\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cphpunit\u003e\n    \u003clisteners\u003e\n        \u003clistener class=\"Bartlett\\LoggerTestListener\"\u003e\n            \u003carguments\u003e\n                \u003cobject class=\"YourLogger\"\u003e\n                    \u003carguments\u003e\n                        \u003cstring\u003eYourPSR3Logger\u003c/string\u003e\n                    \u003c/arguments\u003e\n                \u003c/object\u003e\n            \u003c/arguments\u003e\n        \u003c/listener\u003e\n    \u003c/listeners\u003e\n\u003c/phpunit\u003e\n```\n\nIf you want to have advanced logging strategies, I suggest you to have a look on famous\n[Monolog](https://github.com/Seldaek/monolog) PHP Library.\n\n## Usage with Monolog\n\nWithout handler (then default output will be send to STDERR), we could have such kind of configuration,\nwith logger channel name set to `YourMonologChannel`.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cphpunit\u003e\n    \u003clisteners\u003e\n        \u003clistener class=\"Bartlett\\LoggerTestListener\"\u003e\n            \u003carguments\u003e\n                \u003cobject class=\"Monolog\\Logger\"\u003e\n                    \u003carguments\u003e\n                        \u003cstring\u003eYourMonologChannel\u003c/string\u003e\n                    \u003c/arguments\u003e\n                \u003c/object\u003e\n            \u003c/arguments\u003e\n        \u003c/listener\u003e\n    \u003c/listeners\u003e\n\u003c/phpunit\u003e\n```\n\nAdd some handlers, with basic logging Monolog Strategy (filter on level only).\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cphpunit\u003e\n    \u003clisteners\u003e\n        \u003clistener class=\"Bartlett\\LoggerTestListener\"\u003e\n            \u003carguments\u003e\n                \u003cobject class=\"Monolog\\Logger\"\u003e\n                    \u003carguments\u003e\n                        \u003cstring\u003eYourMonologChannel\u003c/string\u003e\n                        \u003carray\u003e\n                            \u003celement\u003e\n                                \u003cobject class=\"Monolog\\Handler\\StreamHandler\"\u003e\n                                    \u003carguments\u003e\n                                        \u003cstring\u003e/var/logs/monolog.log\u003c/string\u003e\n                                    \u003c/arguments\u003e\n                                \u003c/object\u003e\n                            \u003c/element\u003e\n                            \u003celement\u003e\n                                \u003cobject class=\"Bartlett\\GrowlHandler\"\u003e\n                                    \u003carguments\u003e\n                                        \u003carray\u003e\u003c/array\u003e\n                                        \u003cinteger\u003e250\u003c/integer\u003e \u003c!-- NOTICE --\u003e\n                                    \u003c/arguments\u003e\n                                \u003c/object\u003e\n                            \u003c/element\u003e\n                        \u003c/array\u003e\n                    \u003c/arguments\u003e\n                \u003c/object\u003e\n            \u003c/arguments\u003e\n        \u003c/listener\u003e\n    \u003c/listeners\u003e\n\u003c/phpunit\u003e\n```\n\n**WARNING**: When we used desktop notification such as [growl](http://growl.info/),\nor mobile notifications powered by [Pushover](https://pushover.net/), you probably don't want\nto receive all log records, but just the most important ones (errors, failures, testsuites ended).\n\nActually Monolog can't do this.\nSo this is the reason of the [Pull Request](https://github.com/Seldaek/monolog/pull/411) to add filter capability.\nIt's now available as a standalone package. See [Monolog Wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages) page,\nand [CallbackFilterHandler](https://github.com/llaville/monolog-callbackfilterhandler) project's page\n\nNow create a pre-defined logger with all handlers we wished on and the filter rules for each handlers.\n\n```php\n\u003c?php\n\nuse Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\n\nuse Bartlett\\Monolog\\Handler\\GrowlHandler;\nuse Bartlett\\Monolog\\Handler\\CallbackFilterHandler;\n\nclass YourMonolog extends Logger\n{\n    public function __construct($name = 'PHPUnit')\n    {\n        $filter1 = function($record, $handlerLevel) {\n            if ($record['level'] \u003c $handlerLevel) {\n                return false;\n            }\n            if ($record['level'] \u003e $handlerLevel) {\n                return true;\n            }\n            return (\n                preg_match('/^TestSuite(.*)ended\\./', $record['message']) === 1\n                and\n                $record['level'] == $handlerLevel\n            );\n        };\n\n        $stream = new StreamHandler('/var/logs/monolog.log');\n\n        $handlers = [$stream];\n\n        try {\n            $growl = new GrowlHandler(array(), Logger::NOTICE);\n\n            $filterGrowl = new CallbackFilterHandler(\n                $growl,\n                array($filter1)\n            );\n            $handlers[] = $filterGrowl;\n\n        } catch (\\Exception $e) {\n            // Growl client is probably not started\n            echo $e-\u003egetMessage(), PHP_EOL, PHP_EOL;\n        }\n\n        parent::__construct($name, $handlers);\n    }\n}\n```\n\nAnd of course, declare our new listener like that :\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cphpunit\u003e\n    \u003clisteners\u003e\n        \u003clistener class=\"Bartlett\\LoggerTestListener\"\u003e\n            \u003carguments\u003e\n                \u003cobject class=\"YourMonolog\" /\u003e\n            \u003c/arguments\u003e\n        \u003c/listener\u003e\n    \u003c/listeners\u003e\n\u003c/phpunit\u003e\n```\n\nWe will get all PHPUnit log messages recorded via the `StreamHandler`,\nand only important notifications via `GrowlHandler` (see filter rule with callback `$filter1`).\n\nRun the test suite example :\n\n```shell\nphpunit -c examples/phpunit.monolog.xml\n```\n\nAnd you will get something like:\n\n```shell\nPHPUnit 7.5.1 by Sebastian Bergmann and contributors.\n\nIRSF....F                                                           9 / 9 (100%)\n\nTime: 79 ms, Memory: 10.00MB\n\nThere were 2 failures:\n\n1) Your\\Name_Space\\YourTestSuite::testFailure\nFailed asserting that an array is empty.\n\n/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:31\n\n2) Your\\Name_Space\\YourTestSuite::testDataProvider with data set #3 (1, 1, 3)\nFailed asserting that 2 matches expected 3.\n\n/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:44\n\n--\n\nThere was 1 risky test:\n\n1) Your\\Name_Space\\YourTestSuite::testRisky\nThis test did not perform any assertions\n\n/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:20\n\nFAILURES!\nTests: 9, Assertions: 7, Failures: 2, Skipped: 1, Incomplete: 1, Risky: 1.\n```\n\n**Test Suite results with Monolog Stream Handler**\n\n```shell\n[2018-12-30 11:00:19] PHPUnit.NOTICE: TestSuite 'Demo Test Suite' started with 9 tests. {\"suiteName\":\"Demo Test Suite\",\"testCount\":9,\"operation\":\"startTestSuite\"} []\n[2018-12-30 11:00:19] PHPUnit.NOTICE: TestSuite 'Your\\Name_Space\\YourTestSuite' started with 9 tests. {\"suiteName\":\"Your\\\\Name_Space\\\\YourTestSuite\",\"testCount\":9,\"operation\":\"startTestSuite\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testIncomplete' started. {\"testName\":\"testIncomplete\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testIncomplete\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testIncomplete\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.WARNING: Test 'testIncomplete' is incomplete. {\"testName\":\"testIncomplete\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testIncomplete\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testIncomplete\",\"operation\":\"addIncompleteTest\",\"reason\":\"This test has not been implemented yet.\",\"trace\":\"/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:16\\n\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testIncomplete' ended. {\"testName\":\"testIncomplete\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testIncomplete\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testIncomplete\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testRisky' started. {\"testName\":\"testRisky\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testRisky\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testRisky\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.WARNING: Test 'testRisky' is risky. {\"testName\":\"testRisky\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testRisky\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testRisky\",\"operation\":\"addRiskyTest\",\"reason\":\"This test did not perform any assertions\\n\\n/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:20\",\"trace\":\"\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testRisky' ended. {\"testName\":\"testRisky\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testRisky\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testRisky\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":0} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testSkipped' started. {\"testName\":\"testSkipped\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testSkipped\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testSkipped\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.WARNING: Test 'testSkipped' has been skipped. {\"testName\":\"testSkipped\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testSkipped\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testSkipped\",\"operation\":\"addSkippedTest\",\"reason\":\"This test was skipped for any reason.\",\"trace\":\"/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:26\\n\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testSkipped' ended. {\"testName\":\"testSkipped\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testSkipped\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testSkipped\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":0} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testFailure' started. {\"testName\":\"testFailure\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testFailure\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testFailure\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.ERROR: Test 'testFailure' failed. {\"testName\":\"testFailure\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testFailure\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testFailure\",\"operation\":\"addFailure\",\"reason\":\"Failed asserting that an array is empty.\",\"trace\":\"/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:31\\n\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testFailure' ended. {\"testName\":\"testFailure\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testFailure\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testFailure\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testPass' started. {\"testName\":\"testPass\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testPass\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testPass\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testPass' ended. {\"testName\":\"testPass\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testPass\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testPass\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.NOTICE: TestSuite 'Your\\Name_Space\\YourTestSuite::testDataProvider' started with 4 tests. {\"suiteName\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider\",\"testCount\":4,\"operation\":\"startTestSuite\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #0' started. {\"testName\":\"testDataProvider with data set #0\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #0\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #0 (0, 0, 0)\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #0' ended. {\"testName\":\"testDataProvider with data set #0\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #0\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #0 (0, 0, 0)\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #1' started. {\"testName\":\"testDataProvider with data set #1\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #1\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #1 (0, 1, 1)\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #1' ended. {\"testName\":\"testDataProvider with data set #1\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #1\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #1 (0, 1, 1)\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #2' started. {\"testName\":\"testDataProvider with data set #2\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #2\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #2 (1, 0, 1)\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #2' ended. {\"testName\":\"testDataProvider with data set #2\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #2\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #2 (1, 0, 1)\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #3' started. {\"testName\":\"testDataProvider with data set #3\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #3\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #3 (1, 1, 3)\",\"operation\":\"startTest\"} []\n[2018-12-30 11:00:19] PHPUnit.ERROR: Test 'testDataProvider with data set #3' failed. {\"testName\":\"testDataProvider with data set #3\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #3\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #3 (1, 1, 3)\",\"operation\":\"addFailure\",\"reason\":\"Failed asserting that 2 matches expected 3.\",\"trace\":\"/shared/httpd/phpunit-LoggerTestListener/examples/testSuite.php:44\\n\"} []\n[2018-12-30 11:00:19] PHPUnit.INFO: Test 'testDataProvider with data set #3' ended. {\"testName\":\"testDataProvider with data set #3\",\"testDescriptionArr\":[\"Your\\\\Name_Space\\\\YourTestSuite\",\"testDataProvider with data set #3\"],\"testDescriptionStr\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider with data set #3 (1, 1, 3)\",\"operation\":\"endTest\",\"output\":\"\",\"assertionCount\":1} []\n[2018-12-30 11:00:19] PHPUnit.NOTICE: TestSuite 'Your\\Name_Space\\YourTestSuite::testDataProvider' ended. {\"suiteName\":\"Your\\\\Name_Space\\\\YourTestSuite::testDataProvider\",\"testCount\":3,\"assertionCount\":4,\"failureCount\":1,\"errorCount\":0,\"incompleteCount\":0,\"skipCount\":0,\"riskyCount\":0,\"operation\":\"endTestSuite\"} []\n[2018-12-30 11:00:19] PHPUnit.NOTICE: TestSuite 'Your\\Name_Space\\YourTestSuite' ended. {\"suiteName\":\"Your\\\\Name_Space\\\\YourTestSuite\",\"testCount\":1,\"assertionCount\":3,\"failureCount\":1,\"errorCount\":0,\"incompleteCount\":1,\"skipCount\":1,\"riskyCount\":1,\"operation\":\"endTestSuite\"} []\n[2018-12-30 11:00:19] PHPUnit.NOTICE: TestSuite 'Demo Test Suite' ended. {\"suiteName\":\"Demo Test Suite\",\"testCount\":4,\"assertionCount\":7,\"failureCount\":2,\"errorCount\":0,\"incompleteCount\":1,\"skipCount\":1,\"riskyCount\":1,\"operation\":\"endTestSuite\"} []\n```\n\n**Test Suite results with Growl Handler**\n\n![Growl Notifications](./examples/growlOutput.png)\n\n**NOTE**: Produced by [Growl for Windows](http://www.growlforwindows.com/) (2.0.9 and Smokestack display)\nwith [PHP GNTP library](http://growl.laurent-laville.org/).\n\n## License\n\nLoggerTestListener is licensed under the BSD-3 Clause License - see the LICENSE file for details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllaville%2Fphpunit-loggertestlistener","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fllaville%2Fphpunit-loggertestlistener","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllaville%2Fphpunit-loggertestlistener/lists"}