问题
为了提高我的代码质量,我决定尝试学习如何使用单元测试而不是我平庸的最佳测试解决方案来测试我的代码。
我决定使用 Composer 安装 PHPUnit 作为个人库,让我可以实现常用的数据库功能。起初我没有 PHPUnit 的配置文件,当我运行如下命令时:
$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest
请注意,这是一个终端命令,所以我没有包含 .php
扩展名。上面提到的 GeneralStringFunctionsTest 实际上是一个 GeneralStringFunctionsTest.php
文件。
输出是我所期望的:
时间:31 毫秒,内存:2.75Mb OK(1 次测试,1 次断言)
然后我尝试使用配置文件来自动加载测试套件,而不必每次都手动输入文件。我在我的根目录中创建了一个名为 phpunit.xml
的文件,并在文件中输入了以下内容:http://pastebin.com/0j0L4WBD:
<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
<testsuites>
<testsuite name="Tests">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
现在,当我运行命令时:
phpunit
我得到以下输出:
Sebastian Bergmann 和贡献者的 PHPUnit 4.5.0。从 /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml 读取配置时间:16 毫秒,内存:1.50Mb 未执行测试!
如果有帮助,我的目录结构如下: src - 顶级目录(包含我所有的源代码) tests - 顶级目录(包含我的所有测试,结构与我的 src 文件夹相同) vendor - Composer 第三方文件
我还有 composer json 和 lock 文件,以及顶层的 phpunit xml 文件作为文件。
我尝试过的事情
将 phpunit.xml 中的目录更改为 tests/GeneralStringFunctions
将 phpunit.xml 中的目录更改为 ./tests
将 phpunit.xml 文件移动到测试目录,然后将目录更改为 ./ 而不是测试。
向 phpunit.xml 中的目录标记添加 suffix 属性,以将“Tests”指定为显式后缀。
tests/GeneralStringFunctions/GeneralStringFunctionsTest
是文件夹还是文件名?
GeneralStringFunctionsTest.php
。在命令行界面中,我没有输入 .php
扩展名,因为没有它它也可以工作。
Test.php
而不是 Test
,但是,您可以随意省略它,因为 Test.php
是默认值。
phpunit.xml
运行吗?
对于它的价值(迟到),我最近在为一个简单的网站制作一个新的 Laravel 5.1 项目时遇到了这个问题。我试图调试它并且在尝试时感到困惑:
php artisan make:test homeTest
(它有一个默认测试,它只是断言 true 为 true)
并看到了输出
No tests executed!
对我来说,问题最终与我的 PHP 安装有关——“phpunit”是全局注册和配置不同的,而 Laravel 安装附带的 phpunit 配置正确并且运行完美。
所以修复是运行供应商配置的 phpunit(从与 app/ 和 tests/ 相同的根目录):
./vendor/bin/phpunit
希望对其他人有所帮助!
您的 XML 文件可以正常工作。但是,您必须确保 tests/
文件夹中的 PHP 文件命名如下:
tests/Test.php <--- 注意大写的“T”tests/userTest.php tests/fooBarTest.php 等。
文件名必须以“Test.php”结尾。这就是 PHPUnit 在目录中寻找的东西。
此外,每个测试方法必须具有以“test”开头的名称或 @test
注释:
public function testFooBar()
{
// Your test code
}
或者:
/**
* @test
*/
public function fooBarTest() {
// test code here
}
希望有帮助!
--test-suffix=anything.php
覆盖
在 Windows 上,在终端上使用以下命令
.\vendor\bin\phpunit
那就是如果命令
phpunit
返回“未执行任何测试!”
在 Mac 上时
./vendor/bin/phpunit
希望能帮助到你。
phpunit
(您可以检查它是否运行类似 phpunit --version
的内容,看看它是否与您期望的匹配。Xampp 通常在同一个 php bin 目录中安装一个 phpunit。这就是问题所在大部头书。
在我们的虚拟机上的 PHPUnit 更新到版本 6 后,我遇到了同样的问题。即使 --debug 和 --verbose 也没说什么有用的,只是“没有执行测试”。最后发现新版本中的类和命名空间发生了变化,它只是不想执行包含对旧类的引用的文件。对我来说,解决方法就是在每个测试用例中替换这个:
class MyTestCase extends \PHPUnit_Framework_TestCase {...}
和:
use PHPUnit\Framework\TestCase;
class MyTestCase extends TestCase {...}
我意识到这已经很老了,但它也发生在我身上。希望这会对某人有所帮助。
我的问题是我忘记了 /** @test */ 中的“@”符号
错误的:
/** test */
function a_thread_can_be_deleted()
{
...
}
正确的:
/** @test */
function a_thread_can_be_deleted()
{
...
}
@return void
并且不包含 '@test',这就是 phpunit 无法不要将其识别为测试。
在我决定使用 --debug (顺便说一句的好方法)之前,我拉了我的头发 10 分钟,以发现文件名不遵守命名约定的简单事实,我最后有一个额外的“s” .
错误的
CreateAdminTests
正确的
CreateAdminTest
希望这篇笔记能对某人有所帮助
聚会迟到了,但此信息可能对其他人有所帮助。
以上解决方案对我不起作用。从 Laravel 7.x 开始,默认情况下,PHPUnit 只执行以“Test.php”为后缀的 PHP 文件。例如,如果您创建一个测试,将其命名为 CreateUser
将不起作用,而将其命名为 CreateUserTest
将起作用。
要克服限制,请转到 phpunit.xml
并从 directory
元素修改 suffix
属性:
...
<testsuite name="Unit">
<!-- modify suffix -->
<directory suffix=".php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<!-- modify suffix -->
<directory suffix=".php">./tests/Feature</directory>
</testsuite>
...
这将指示 PHPUnit 从目录中运行所有扩展名为 .php
的文件。更新 phpunit.xml
后清除应用程序缓存的注意事项:
php artisan config:cache
可以在此处找到有关 PHPUnit XML 配置的其他信息:https://phpunit.de/manual/6.5/en/appendixes.configuration.html
您只需从供应商文件中调用它
vendor\bin\phpunit
注意\不/
而不是运行 phpunit
利用
供应商\bin\phpunit
如果您使用的是 PHPSTORM 转到设置然后转到
测试框架并单击 + 并选择
PHPUnit Local 然后
使用 Composer Auto Loader 然后将其粘贴到脚本字段的路径中
C:\{您的项目名称}\vendor\autoload.php
点击确定
快乐测试
检查 phpunit.xml 文件,查看测试套件。
我的 phpunit (2019) 版本正在寻找以 (后缀) *Test.php 结尾的文件。因此,请确保所有测试文件都正确命名(例如:BookTest.php 正确,BookTests.php 错误,BookTestCase.php 错误)。
测试文件中的函数名称必须以 test
为前缀,或者在函数之前添加注释
/** @test */
确保它不是
/* @test */
因为那行不通。斜线后面必须有两个星号,而不是一个。
我有同样的问题,我发现我所有的配置和语法都很好。我不知道为什么,只是简单地添加单词“tests”(复数形式),这是包含所有测试的 App 文件夹中的名称,对我来说效果很好:
[terminal] vendor/bin/phpunit tests
如果我的别名与普通的“phpunit”一起使用,我也会这样做
[terminal] phpunit tests
与过滤器相同
[terminal] vendor/bin/phpunit --filter 'Tests\\Routes\\AnyTest' Tests
请注意,末尾的“tests”是复数形式,与 App 文件夹中的文件夹名称相同。
希望它可以帮助并节省其他人的时间。
此致
如果你没有测试课
php artisan make:test TestName //default is future testing
php artisan make:test TestName --unit //for unit testing
那么您将在子文件夹单元下的测试文件夹中找到测试文件,如果您想执行所有使用的测试文件,您将在未来找到
注意:为了测试,您可以编辑您的 ppuint.xml 文件,最好的方法是如果您使用 sqlite 来设置它,然后在最后一行之后添加这两行
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
您可以使用 vendor/bin/PHPUnit 执行您的测试文件 //这将执行每个测试文件 vendor/bin/PHPUnit 如果您希望执行单个函数,您可以使用
vendor/bin/PHPUnit --filter function_name or classname
最后,在每个测试中使用 /** @test*/ 以便 PHPUnit 知道这是一个测试
您是否在 phpunit.xml 文件中添加了测试套件?
<phpunit>
<testsuite name="app1" >
<directory>./</directory>
</testsuite>
</phpunit>
您可以在其中添加多个目录。
Time: 28 ms, Memory: 1.50Mb No tests executed!
Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!
。当我手动引用它时它确实有效,只是由于某种原因它不喜欢从配置文件中加载:(
类和文件名中没有测试,例如“AuthorizationTest”
对我来说,使用 phpunit --debug 向我展示了它没有执行的测试,在里面,我有
$this->visit('/')
->see('Laravel');
我认为因为该目录受到 .htaccess 身份验证的保护,所以无法访问该页面
我的解决方案是进行此测试(或者很可能进行 .htaccess 身份验证)
这已经很晚了,但我希望它可以帮助某人。
我通过使用绝对引用来运行测试。文件夹结构 [project/tests/test.php]
我的目录行看起来像这样 ./tests/test.php
可能有点偏,但如果你(像我一样)在 Vagrant 中使用 Laravel,请确保你在 vagrant 盒子内而不是在“windows 端”运行 phpunit。 :)
我遇到了没有执行测试的问题,即使事情设置得很好。
原因是命名空间不是文件的第一个命令,而是在一些文档块注释之后。
还原导致 phpunit 看到测试并正确运行。
我的有点好笑。
当我使用 php artisan make:test
时,我不小心将 .php 与创建 ProductRewardPointController.php.php
的 ProductRewardPointController.php
类似,而 phpunit 只是忽略了它。
我只是删除了多余的 .php 和一切恢复正常
我有同样的问题没有执行测试!,通过保持相同的文件名和类名来解决。
如果您使用 JetBrains PHPStorm 等 IDE,还请注意:在 Run/Debug Configurations
窗口中,需要将 Test scope
设置为 directory
并将该目录指向您的 tests
文件夹位于。
我花了半个小时才发现我忘了设置目录。只要您正确设置了测试范围和目录,您就可以使用全局 phpunit.phar
,IDE 将为您处理其他内容。
如果您使用的是@dataprovider,请确保其方法的可见性是 public
这是我的问题
对于使用 composer
的我,它同时适用于 ./vendor/bin/phpunit
和 phpunit
,我没有全局安装 phpunit
。
@alext 的回答帮助我解决了这个问题。
因此,如果您通过运行 phpunit -h
输出检查 phpunit
手册:
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.
Usage: phpunit [options] UnitTest [UnitTest.php]
phpunit [options] <directory>
它需要一个目录或文件。 [options]
是可选的,您可以使用 phpunit.xml
文件传递它们
因为您的测试在 tests
中,所以您应该尝试使用 phpunit tests
如果它不起作用,请尝试使用 phpunit
中的示例:https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html
这个问题有很多可能的答案。如果有人遇到与我相同的情况 - 我收到与 OP 相同的消息的原因是我的数据提供程序函数是 private
。
我将其更改为 public
,一切都开始工作了。
我在这里谈论数据提供者:
/**
* @dataProvider myProvider
* @return void
*/
public function testGetWhatever()
{
$this->assertTrue(true);
}
public function myProvider()
{
return ...;
}
就我而言,我在课堂上添加了注释@group active
/**
* @group active
**/
使用 de cmd 控制台通过 enterely 路径 Test realized 解决了这个问题
我没有找到其他方法It does not work from this way
我希望这对某人有帮助
phpunit --debug ./
不定期副业成功案例分享
vendor/bin/phpunit
而不是全局phpunit
二进制文件。我什至已经删除了全局phpunit
二进制文件,这样我就不会再不小心犯同样的错误了——从那以后它就再也没有出现过。我会将其标记为已接受的答案,因为这很可能是原因。./vendor/bin/phpunit
为我解决了问题./vendor/bin/phpunit
创建一个alias
vendor\bin\phpunit
(在 Windows 上)对我有用!