{"id":17355085,"url":"https://github.com/xiaobopang/phalcon_phpunit","last_synced_at":"2025-08-02T04:32:43.371Z","repository":{"id":171485017,"uuid":"185173218","full_name":"xiaobopang/phalcon_phpunit","owner":"xiaobopang","description":"这是一个关于phalcon单元测试的小教程","archived":false,"fork":false,"pushed_at":"2019-05-27T05:41:42.000Z","size":163,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-08T13:45:42.351Z","etag":null,"topics":["phalcon","phalcon-phpunit","phpunit","phpunit-testcase"],"latest_commit_sha":null,"homepage":"https://www.unclepang.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xiaobopang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-05-06T10:16:26.000Z","updated_at":"2019-07-26T10:33:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"d6ea7158-06ad-4337-90a7-4a576e38cbad","html_url":"https://github.com/xiaobopang/phalcon_phpunit","commit_stats":null,"previous_names":["xiaobopang/phalcon_phpunit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xiaobopang/phalcon_phpunit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaobopang%2Fphalcon_phpunit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaobopang%2Fphalcon_phpunit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaobopang%2Fphalcon_phpunit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaobopang%2Fphalcon_phpunit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xiaobopang","download_url":"https://codeload.github.com/xiaobopang/phalcon_phpunit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaobopang%2Fphalcon_phpunit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268334618,"owners_count":24233793,"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","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["phalcon","phalcon-phpunit","phpunit","phpunit-testcase"],"created_at":"2024-10-15T17:42:13.022Z","updated_at":"2025-08-02T04:32:43.349Z","avatar_url":"https://github.com/xiaobopang.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 简介\n \n 这是一个基于Phalcon框架的单元测试demo小教程，希望对初次编写单元测试的童鞋有所帮助。\n\n \n### 前提\n\n```\n   1、在开始之前先假定你已经使用过Phalcon这个框架，对其有一定基础认知。\n   2、其次你对composer包依赖管理有一定的了解\n```\n\n## 快速开始\n\n### 1.安装PHPUnit,以下为Linux操作环境：\n\n````\n        $ wget wget -O phpunit https://phar.phpunit.de/phpunit-8.phar\n\n        $ sudo mv phpunit-8.phar /usr/local/bin/phpunit\n\n        $ sudo chmod +x /usr/local/bin/phpunit\n\n        $ phpunit --version\n\n````\n#### 如果输出结果如下，则表明你已经安装成功：\n\n![执行结果](./test.png)\n\n[PHPUnit](https://github.com/sebastianbergmann/phpunit) 👈点击左侧\"PHPUnit\"\n\n\n### 2、通过composer来引入相关测试组件，首先进入你的项目根目录执行一下命令：\n\n####    1）composer require --dev phpunit/phpunit ^8\n\n####    2）composer require phalcon/incubator\n\n####    3）以上安装结束后，在你的项目根目录下创建tests文件夹，并进入到tests文件夹下\n\n####    4）在tests文件夹下新建phpunit.xml，格式如下：\n\n```\n        \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n        \u003cphpunit bootstrap=\"./TestHelper.php\"\n                backupGlobals=\"false\"\n                backupStaticAttributes=\"true\"\n                verbose=\"false\"\n                colors=\"true\"\n                cacheResult=\"true\"\n                convertErrorsToExceptions=\"true\"\n                convertNoticesToExceptions=\"true\"\n                convertWarningsToExceptions=\"true\"\n                mapTestClassNameToCoveredClassName=\"false\"\n                processIsolation=\"false\"\n                stopOnFailure=\"false\"\n                syntaxCheck=\"true\"\u003e\n\n            \u003ctestsuites\u003e\n                \u003ctestsuite name=\"Phalcon - Testsuite\"\u003e\n                    \u003c!--仅当php版本不低于7.0的时候才执行单元测试--\u003e\n                    \u003cdirectory suffix=\"Test.php\" phpVersion=\"7.0\" phpVersionOperator=\"\u003e=\"\u003e./\u003c/directory\u003e\n                    \u003cfile phpVersion=\"7.0\" phpVersionOperator=\"\u003e=\"\u003e./Test/UnitCaseTest.php\u003c/file\u003e\n                \u003c/testsuite\u003e\n            \u003c/testsuites\u003e\n            \u003c!--定义PHP变量--\u003e\n            \u003cphp\u003e\n                    \u003cincludePath\u003e.\u003c/includePath\u003e\n                    \u003cget  name=\"name\" value=\"jack\"/\u003e\n                    \u003cpost name=\"username\" value=\"jack\"/\u003e\n                    \u003cpost name=\"password\" value=\"9cbf8a4dcb8e30682b927f352d6559a0\"/\u003e\n            \u003c/php\u003e\n            \u003c!--代码覆盖率白名单--\u003e\n            \u003cfilter\u003e\n                \u003cwhitelist processUncoveredFilesFromWhitelist=\"true\"\u003e\n                    \u003cdirectory suffix=\".php\"\u003e./\u003c/directory\u003e\n                    \u003cfile\u003e./UnitCaseTest.php\u003c/file\u003e\n                    \u003cexclude\u003e\n                        \u003cdirectory suffix=\".php\"\u003e./\u003c/directory\u003e\n                        \u003cfile\u003e./UnitCaseTest.php\u003c/file\u003e\n                    \u003c/exclude\u003e\n                \u003c/whitelist\u003e\n            \u003c/filter\u003e\n        \u003c/phpunit\u003e\n```\n\n####    5）紧接着在你的tests文件夹下新建一个TestHelper.php，其内容如下：\n\n```\n        \u003c?php\n            /*\n            * Created Date: Sunday May 5th 2019\n            * Author: Pangxiaobo\n            * Last Modified: Sunday May 5th 2019 5:57:13 pm\n            * Modified By: the developer formerly known as Pangxiaobo at \u003c10846295@qq.com\u003e\n            * Copyright (c) 2019 Pangxiaobo\n            */\n\n            use Phalcon\\DI;\n            use Phalcon\\DI\\FactoryDefault;\n\n            ini_set('display_errors', 1);\n            error_reporting(E_ALL);\n\n            define('ROOT_PATH', __DIR__);\n            define('PATH_INCUBATOR', __DIR__ . '/../vendor/phalcon/incubator/');\n            define('PATH_CONFIG', __DIR__ . '/../api/config/config.php');\n            define('PATH_MODELS', __DIR__ . '/../api/models/');\n            define('PATH_CONTROLLERS', __DIR__ . '/../api/controllers/');\n            define('PATH_SERVICES', __DIR__ . '/../api/services/');\n\n            set_include_path(\n                ROOT_PATH . PATH_SEPARATOR . get_include_path()\n            );\n\n            // 使用autoloader加载应用中的类，autoload依赖可以在composer vendor目录下找到\n            $loader = new \\Phalcon\\Loader();\n\n            $loader-\u003eregisterDirs(array(\n                ROOT_PATH,\n                PATH_CONFIG,\n                PATH_MODELS,\n                PATH_SERVICES,\n                PATH_CONTROLLERS,\n            ));\n\n            $loader-\u003eregisterNamespaces(array(\n                'Phalcon' =\u003e PATH_INCUBATOR . 'Library/Phalcon/',\n            ));\n\n            $loader-\u003eregister();\n            $config = include PATH_CONFIG;\n            $di = new FactoryDefault();\n            Di::reset();\n\n            //这里我们注入一些需要用到的service服务，例如：db\n            $di-\u003eset('db', function () use ($config) {\n                return new \\Phalcon\\Db\\Adapter\\Pdo\\Mysql($config-\u003edatabase-\u003etoArray());\n            }, true);\n\n            Di::setDefault($di);\n```\n\n####    6）好了，我们在创建完TestHelper.php之后，在tests目录下接着新建一个UnitTestCase.php的文件：\n\n```\n        \u003c?php\n            /*\n            * Created Date: Sunday May 5th 2019\n            * Author: Pangxiaobo\n            * Last Modified: Sunday May 5th 2019 6:07:08 pm\n            * Modified By: the developer formerly known as Pangxiaobo at \u003c10846295@qq.com\u003e\n            * Copyright (c) 2019 Pangxiaobo\n            */\n\n            use Phalcon\\Di;\n            use Phalcon\\Di\\FactoryDefault;\n            use Phalcon\\Mvc\\Model\\Manager as ModelsManager;\n            use \\Phalcon\\Test\\UnitTestCase as PhalconTestCase;\n            use Phalcon\\Cache\\Backend\\Redis as BackRedis;\n            use Phalcon\\Cache\\Frontend\\Data as FrontData;\n\n            abstract class UnitTestCase extends PhalconTestCase\n            {\n\n            /**\n            * @var \\Voice\\Cache\n            */\n                protected $_cache;\n\n                /**\n                * @var \\Phalcon\\Config\n                */\n                protected $_config;\n\n                /**\n                * @var bool\n                */\n                private $_loaded = false;\n\n                public function setUp(Phalcon\\DiInterface $di = null, Phalcon\\Config $config = null)\n                {\n                    global $config;\n\n                    if (is_null($config)) {\n                        $this-\u003e_config = include __DIR__ . '/../api/config/config.php';\n                    } else {\n                        $this-\u003e_config = $config;\n                    }\n                    \n                    // 在测试期间根据需要加载一些服务\n                    $di = new FactoryDefault();\n                    Di::reset();\n\n                    $di-\u003eset('db', function () use ($config) {\n                        return new \\Phalcon\\Db\\Adapter\\Pdo\\Mysql($config-\u003edatabase-\u003etoArray());\n                    });\n                    \n                    $di-\u003eset('modelsManager', function () {\n                        return new ModelsManager();\n                    }, true);\n\n                    $di-\u003eset(\"config\", function () use ($config) {\n                        return $config;\n                    });\n                    \n                    $di-\u003esetShared('serviceCache', function () use ($config) {\n                        $frontCache = new FrontData([\n                            'lifetime' =\u003e 2592000,\n                        ]);\n                        return new BackRedis($frontCache,(array) $config-\u003eredisCache);\n                    });\n\n                    Di::setDefault($di);\n                    $this-\u003esetDi($di);\n\n                // parent::setUp($di, $config);\n                    $this-\u003e_loaded = true;\n                }\n\n                /**\n                * 重置testcase环境\n                *\n                * @return void\n                */\n                protected function tearDown()\n                {\n                    $di = $this-\u003egetDI();\n                    $di::reset();\n                    parent::tearDown();\n                }\n\n                /**\n                * Check if the test case is setup properly\n                * @throws \\PHPUnit_Framework_IncompleteTestError;\n                */\n                public function __destruct()\n                {\n                    if (!$this-\u003e_loaded) {\n                        throw new \\PHPUnit_Framework_IncompleteTestError('Please run parent::setUp().');\n                    }\n                }\n            }\n```\n\n####    7）为了使你的测试和你的应用隔离开来，避免污染整个项目源代码，我们可以为单元测试创建命名空间。好了，接下来我们需要在tests文件夹下接着创建一个名叫Test的文件夹。\n\n\n####    8）然后，我们在Test文件里新建一个名叫CaseTest.php的文件。其内容如下：\n\n```\n        \u003c?php\n            /*\n            * Created Date: Monday May 6th 2019\n            * Author: Pangxiaobo\n            * Last Modified: Monday May 6th 2019 2:24:53 pm\n            * Modified By: the developer formerly known as Pangxiaobo at \u003c10846295@qq.com\u003e\n            * Copyright (c) 2019 Pangxiaobo\n            */\n\n            namespace Test;\n            /**\n            * Class UnitCaseTest\n            */\n            class CaseTest extends \\UnitTestCase\n            {\n                /**\n                * 控制器取值测试\n                * @return void\n                */\n                public function testController()\n                {\n                    $logStatus = TestController::$logStatus;\n                    $this-\u003eassertEquals($logStatus, 1, \"获取到控制器的logStatus=\" . $logStatus);\n                }\n\n                /**\n                * 输出测试\n                *\n                * @return void\n                */\n                public function testHello()\n                {\n                    $name = $_GET[\"name\"];\n                    $test = new TestController();\n                    $test-\u003ehello($name);\n                    $this-\u003eexpectOutputString('hello,jack');\n                }\n\n                /**\n                * 模型类测试\n                *\n                * @return void\n                */\n                public function testModel()\n                {\n                    $testModel = new TestModel();\n                    $testModel-\u003esource = \"Test\";\n                    $testModel-\u003elistFields = [\"id\", \"user\", \"age\"];\n                    $listInfo = $testModel-\u003eretrieve(0, 3);\n                    // 读出的条目数量是否正确\n                    $this-\u003eassertEquals(\n                        count($listInfo[\"List\"]),\n                        3,\n                        \"查询数据和预期不符\"\n                    );\n                }\n\n                /**\n                * 获取参数测试\n                *\n                * @return void\n                */\n                public function testTest()\n                {\n                    $username = $_POST['username'];\n                    $password = $_POST['password'];\n                    $this-\u003eassertEquals($username, 'jack', \"用户名有误\");\n                    $this-\u003eassertEquals($password, '9cbf8a4dcb8e30682b927f352d6559a0', \"密码有误\");\n                }\n            }\n\n```       \n\n ####   9）因为我们之前在UnitTestCase.php的setUp()中做了一些服务的依赖注入，以及在TestHelper.php中注册了相关的空间，并引入了Autoload相关文件。到此你就可以开心的编写你所想要的单元测试代码了。原文附上tests文件夹，仅供参考，如发现错误,还望指出。谢谢～\n \n ####   10）原文参考了Phalcon官网提供的相关单元测试文章，下面有相关链接：\n\n\n[PhalconTestUnit](https://docs.phalconphp.com/3.4/en/unit-testing.html) 👈点击左侧\"PhalconTestUnit\"查看相关文章\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaobopang%2Fphalcon_phpunit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxiaobopang%2Fphalcon_phpunit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaobopang%2Fphalcon_phpunit/lists"}