PHPUnit - 'No tests executed' 使用配置文件时
PHPUnit - 'No tests executed' when using configuration file
问题
为了提高我的代码质量,我决定尝试学习如何使用单元测试而不是我平庸的最佳测试解决方案来测试我的代码。
我决定使用 composer 安装 PHPUnit 作为个人库,它允许我实现常用的数据库功能。起初我没有 PHPUnit 的配置文件,当我 运行 命令如下:
$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest
请注意,这是一个终端命令,所以我没有包含 .php
扩展名。上面提到的GeneralStringFunctionsTest其实就是一个GeneralStringFunctionsTest.php
文件
输出符合我的预期:
Time: 31 ms, Memory: 2.75Mb
OK (1 test, 1 assertion)
然后我尝试使用配置文件自动加载测试套件,而不必每次都手动输入文件。我在我的根目录中创建了一个名为 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
我得到以下输出:
PHPUnit 4.5.0 by Sebastian Bergmann and contributors.
Configuration read from /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml
Time: 16 ms, Memory: 1.50Mb
No tests executed!
如果对你有帮助,我的目录结构如下:
src - 顶级目录(包含我所有的源代码)
tests - 顶级目录(包含我所有的测试,结构与我的 src 文件夹相同)
vendor - Composer 第三方文件
我还有 composer json 和 lock 文件,以及顶层的 phpunit xml 文件作为文件。
我尝试过的事情
- 正在将
phpunit.xml
中的目录更改为 tests/GeneralStringFunctions
- 正在将
phpunit.xml
中的目录更改为 ./tests
- 将
phpunit.xml
文件移动到 tests
目录,然后将目录更改为 ./
而不是 tests
。
- 向
phpunit.xml
中的目录标记添加后缀属性以将 "Tests" 指定为显式后缀。
您是否向 phpunit.xml 文件添加了测试套件?
<phpunit>
<testsuite name="app1" >
<directory>./</directory>
</testsuite>
</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
}
希望对您有所帮助!
对我来说,使用 phpunit --debug 告诉我它没有执行哪个测试,
在里面,我有
$this->visit('/')
->see('Laravel');
而且我认为是因为该目录受 .htaccess 身份验证保护,所以无法访问该页面
我的解决方案是取消这个测试(或者最有可能取消 .htaccess 身份验证)
为了它的价值(迟到了),我最近在为一个简单的网站制作一个新的 Laravel 5.1 项目时 运行 进入了这个。我试着调试它,当我尝试时感到困惑:
php artisan make:test homeTest
(它有一个默认测试,只是断言 true 是 true)
并看到输出
No tests executed!
最终对我造成的问题与我的 PHP 安装有关——"phpunit" 是全局注册和配置不同的,而 Laravel 安装附带的 phpunit配置得恰到好处 运行 完美。
所以修复是 运行 供应商配置的 phpunit(来自与 app/ 和 tests/ 相同的根目录):
./vendor/bin/phpunit
希望对其他人有所帮助!
在我们的虚拟机上的 PHPUnit 更新到版本 6 后,我遇到了同样的问题。即使 --debug 和 --verbose 也没说什么有用的,只是 "No tests executed"。最后发现 类 和命名空间在新版本中发生了变化,它只是不想执行包含对旧 类 的引用的文件。对我来说,修复只是在每个测试用例中替换这个:
class MyTestCase extends \PHPUnit_Framework_TestCase {...}
与:
use PHPUnit\Framework\TestCase;
class MyTestCase extends TestCase {...}
使用 de cmd 控制台解决了这个传递 enterely 路径的问题
Test realized
我没有找到其他方法
It does not work from this way
我希望这对某人有帮助
我知道这太老了,但它也发生在我身上。希望这会对某人有所帮助。
我的问题是我忘记了 /** @test */
中的“@”符号
错误:
/** test */
function a_thread_can_be_deleted()
{
...
}
右:
/** @test */
function a_thread_can_be_deleted()
{
...
}
我的有点搞笑。
当我使用 php artisan make:test
时,我不小心把 .php 像 ProductRewardPointController.php
这样创建了 ProductRewardPointController.php.php
和 phpunit直接无视了
我只是删除了多余的 .php 然后一切恢复正常
您只需要从供应商文件中调用它
vendor\bin\phpunit
注意\不/
这已经很晚了,但我希望它对某人有所帮助。
我通过使用绝对引用得到了 运行 的测试。
文件夹结构 [ project/tests/test.php]
我的目录行是这样的。/tests/test.php
在 windows 终端上使用以下命令
.\vendor\bin\phpunit
如果命令
phpunit
returns "No tests executed!"
在 Mac
./vendor/bin/phpunit
希望对您有所帮助。
可能有点偏题,但是如果你(像我一样)在 Vagrant 中使用 Laravel,请确保你是 运行 phpunit 在 vagrant box 里面而不是 "windows side"。 :)
在我决定使用 --debug(顺便说一下,这是个好方法)之前,我把头发拉了 10 分钟来发现一个简单的事实,即文件名没有尊重命名约定,我在最后多了一个"s"。
错误
CreateAdminTests
对
CreateAdminTest
希望这篇笔记能对某人有所帮助
如果您使用的是 PHPSTORM,请转到“设置”,然后转到
Test Frameworks
然后点击 + 并选择
PHPUnit Local
然后
Use Composer Auto Loader
然后将其粘贴到脚本字段的路径中
C:\{YOUR PROJECT NAME}\vendor\autoload.php
单击确定
HAPPY TESTING
我遇到了没有测试被执行的问题,即使一切都设置好了。
原因是命名空间不是文件的第一个命令,而是在一些文档块注释之后。
还原导致 phpunit 看到测试并 运行 正确。
我有同样的问题 没有执行测试!,通过保持 file 和 的相同名称解决class 姓名。
检查phpunit.xml文件,查看测试套件。
我的 phpunit (2019) 版本正在寻找以(后缀)*Test.php 结尾的文件。
因此,确保所有测试文件都正确命名(例如:BookTest.php 正确,BookTests.php 不正确,BookTestCase.php 不正确)。
如果您使用的是 IDE,例如 JetBrains PHPStorm,请注意:在 Run/Debug Configurations
window 中,Test scope
需要设置为 directory
并将该目录指向您的 tests
文件夹所在的位置。
半个小时才弄明白我忘记设置目录了。只要您正确设置测试范围和目录,就可以使用全局 phpunit.phar
,IDE 将为您处理其他内容。
而不是运行
phpunit
使用
vendor\bin\phpunit
聚会迟到了,但此信息可能对其他人有帮助。
以上解决方案对我不起作用。自 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
有关 PHP 单元 XML 配置的其他信息可在此处找到:https://phpunit.de/manual/6.5/en/appendixes.configuration.html
测试文件中的函数名称必须以test
为前缀,或者在函数
之前添加注释
/** @test */
确保它不是
/* @test */
因为那行不通。斜线后需要有两个星号,而不是一个。
如果您使用的是@dataprovider,请确保其方法的可见性 public
这是我的问题
我遇到了同样的问题,我发现我所有的配置和语法都没有问题。我不知道为什么,只是简单地添加单词“tests”(复数形式),这是包含所有测试的 App 文件夹中的名称,对我来说效果很好:
[terminal] vendor/bin/phpunit tests
如果我的别名适用于普通的“phpunit”,我也会这样做
[terminal] phpunit tests
与过滤器相同
[terminal] vendor/bin/phpunit --filter 'Tests\Routes\AnyTest' Tests
请注意,末尾的“tests”是复数形式,与 App 文件夹中的文件夹名称相同。
希望对其他人有所帮助并节省时间。
此致
如果您没有测试 Class
php artisan make:test TestName //default is future testing
php artisan make:test TestName --unit //for unit testing
然后你会在子文件夹unit或future下的测试文件夹中找到测试文件
如果你想执行所有的测试文件使用
注意:为了进行测试,您可以编辑 phpuint.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
最后,使用
/** @测试*/
在每一次测试中,为了让 PHPUnit 知道
这是一个测试
对我来说 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
file
传递它们
因为你的测试是在tests
,所以你应该尝试phpunit tests
如果它不起作用,请尝试使用 phpunit
中的示例:https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html
在我的例子中,我在 class
中添加了注解 @group active
/**
* @group active
**/
class 和文件名中没有测试,例如“AuthorizationTest”
这个问题有很多可能的答案。
如果有人遇到与我相同的情况 - 我收到与 OP 相同的消息的原因是我的 data-provider 函数是 private
.
我将其更改为 public
,一切都开始工作了。
我在这里谈论 data-provider:
/**
* @dataProvider myProvider
* @return void
*/
public function testGetWhatever()
{
$this->assertTrue(true);
}
public function myProvider()
{
return ...;
}
问题
为了提高我的代码质量,我决定尝试学习如何使用单元测试而不是我平庸的最佳测试解决方案来测试我的代码。
我决定使用 composer 安装 PHPUnit 作为个人库,它允许我实现常用的数据库功能。起初我没有 PHPUnit 的配置文件,当我 运行 命令如下:
$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest
请注意,这是一个终端命令,所以我没有包含 .php
扩展名。上面提到的GeneralStringFunctionsTest其实就是一个GeneralStringFunctionsTest.php
文件
输出符合我的预期:
Time: 31 ms, Memory: 2.75Mb
OK (1 test, 1 assertion)
然后我尝试使用配置文件自动加载测试套件,而不必每次都手动输入文件。我在我的根目录中创建了一个名为 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
我得到以下输出:
PHPUnit 4.5.0 by Sebastian Bergmann and contributors.
Configuration read from /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml
Time: 16 ms, Memory: 1.50Mb
No tests executed!
如果对你有帮助,我的目录结构如下:
src - 顶级目录(包含我所有的源代码)
tests - 顶级目录(包含我所有的测试,结构与我的 src 文件夹相同)
vendor - Composer 第三方文件
我还有 composer json 和 lock 文件,以及顶层的 phpunit xml 文件作为文件。
我尝试过的事情
- 正在将
phpunit.xml
中的目录更改为tests/GeneralStringFunctions
- 正在将
phpunit.xml
中的目录更改为./tests
- 将
phpunit.xml
文件移动到tests
目录,然后将目录更改为./
而不是tests
。 - 向
phpunit.xml
中的目录标记添加后缀属性以将 "Tests" 指定为显式后缀。
您是否向 phpunit.xml 文件添加了测试套件?
<phpunit>
<testsuite name="app1" >
<directory>./</directory>
</testsuite>
</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
}
希望对您有所帮助!
对我来说,使用 phpunit --debug 告诉我它没有执行哪个测试, 在里面,我有
$this->visit('/')
->see('Laravel');
而且我认为是因为该目录受 .htaccess 身份验证保护,所以无法访问该页面
我的解决方案是取消这个测试(或者最有可能取消 .htaccess 身份验证)
为了它的价值(迟到了),我最近在为一个简单的网站制作一个新的 Laravel 5.1 项目时 运行 进入了这个。我试着调试它,当我尝试时感到困惑:
php artisan make:test homeTest
(它有一个默认测试,只是断言 true 是 true)
并看到输出
No tests executed!
最终对我造成的问题与我的 PHP 安装有关——"phpunit" 是全局注册和配置不同的,而 Laravel 安装附带的 phpunit配置得恰到好处 运行 完美。
所以修复是 运行 供应商配置的 phpunit(来自与 app/ 和 tests/ 相同的根目录):
./vendor/bin/phpunit
希望对其他人有所帮助!
在我们的虚拟机上的 PHPUnit 更新到版本 6 后,我遇到了同样的问题。即使 --debug 和 --verbose 也没说什么有用的,只是 "No tests executed"。最后发现 类 和命名空间在新版本中发生了变化,它只是不想执行包含对旧 类 的引用的文件。对我来说,修复只是在每个测试用例中替换这个:
class MyTestCase extends \PHPUnit_Framework_TestCase {...}
与:
use PHPUnit\Framework\TestCase;
class MyTestCase extends TestCase {...}
使用 de cmd 控制台解决了这个传递 enterely 路径的问题 Test realized
我没有找到其他方法 It does not work from this way
我希望这对某人有帮助
我知道这太老了,但它也发生在我身上。希望这会对某人有所帮助。
我的问题是我忘记了 /** @test */
中的“@”符号错误:
/** test */
function a_thread_can_be_deleted()
{
...
}
右:
/** @test */
function a_thread_can_be_deleted()
{
...
}
我的有点搞笑。
当我使用 php artisan make:test
时,我不小心把 .php 像 ProductRewardPointController.php
这样创建了 ProductRewardPointController.php.php
和 phpunit直接无视了
我只是删除了多余的 .php 然后一切恢复正常
您只需要从供应商文件中调用它
vendor\bin\phpunit
注意\不/
这已经很晚了,但我希望它对某人有所帮助。
我通过使用绝对引用得到了 运行 的测试。 文件夹结构 [ project/tests/test.php]
我的目录行是这样的。/tests/test.php
在 windows 终端上使用以下命令
.\vendor\bin\phpunit
如果命令
phpunit
returns "No tests executed!"
在 Mac
./vendor/bin/phpunit
希望对您有所帮助。
可能有点偏题,但是如果你(像我一样)在 Vagrant 中使用 Laravel,请确保你是 运行 phpunit 在 vagrant box 里面而不是 "windows side"。 :)
在我决定使用 --debug(顺便说一下,这是个好方法)之前,我把头发拉了 10 分钟来发现一个简单的事实,即文件名没有尊重命名约定,我在最后多了一个"s"。
错误
CreateAdminTests
对
CreateAdminTest
希望这篇笔记能对某人有所帮助
如果您使用的是 PHPSTORM,请转到“设置”,然后转到
Test Frameworks
然后点击 + 并选择
PHPUnit Local
然后Use Composer Auto Loader
然后将其粘贴到脚本字段的路径中C:\{YOUR PROJECT NAME}\vendor\autoload.php
单击确定
HAPPY TESTING
我遇到了没有测试被执行的问题,即使一切都设置好了。
原因是命名空间不是文件的第一个命令,而是在一些文档块注释之后。
还原导致 phpunit 看到测试并 运行 正确。
我有同样的问题 没有执行测试!,通过保持 file 和 的相同名称解决class 姓名。
检查phpunit.xml文件,查看测试套件。
我的 phpunit (2019) 版本正在寻找以(后缀)*Test.php 结尾的文件。 因此,确保所有测试文件都正确命名(例如:BookTest.php 正确,BookTests.php 不正确,BookTestCase.php 不正确)。
如果您使用的是 IDE,例如 JetBrains PHPStorm,请注意:在 Run/Debug Configurations
window 中,Test scope
需要设置为 directory
并将该目录指向您的 tests
文件夹所在的位置。
半个小时才弄明白我忘记设置目录了。只要您正确设置测试范围和目录,就可以使用全局 phpunit.phar
,IDE 将为您处理其他内容。
而不是运行 phpunit
使用
vendor\bin\phpunit
聚会迟到了,但此信息可能对其他人有帮助。
以上解决方案对我不起作用。自 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
有关 PHP 单元 XML 配置的其他信息可在此处找到:https://phpunit.de/manual/6.5/en/appendixes.configuration.html
测试文件中的函数名称必须以test
为前缀,或者在函数
/** @test */
确保它不是
/* @test */
因为那行不通。斜线后需要有两个星号,而不是一个。
如果您使用的是@dataprovider,请确保其方法的可见性 public
这是我的问题
我遇到了同样的问题,我发现我所有的配置和语法都没有问题。我不知道为什么,只是简单地添加单词“tests”(复数形式),这是包含所有测试的 App 文件夹中的名称,对我来说效果很好:
[terminal] vendor/bin/phpunit tests
如果我的别名适用于普通的“phpunit”,我也会这样做
[terminal] phpunit tests
与过滤器相同
[terminal] vendor/bin/phpunit --filter 'Tests\Routes\AnyTest' Tests
请注意,末尾的“tests”是复数形式,与 App 文件夹中的文件夹名称相同。
希望对其他人有所帮助并节省时间。
此致
如果您没有测试 Class
php artisan make:test TestName //default is future testing
php artisan make:test TestName --unit //for unit testing
然后你会在子文件夹unit或future下的测试文件夹中找到测试文件 如果你想执行所有的测试文件使用
注意:为了进行测试,您可以编辑 phpuint.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
最后,使用 /** @测试*/ 在每一次测试中,为了让 PHPUnit 知道 这是一个测试
对我来说 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
file
因为你的测试是在tests
,所以你应该尝试phpunit tests
如果它不起作用,请尝试使用 phpunit
中的示例:https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html
在我的例子中,我在 class
中添加了注解 @group active/**
* @group active
**/
class 和文件名中没有测试,例如“AuthorizationTest”
这个问题有很多可能的答案。
如果有人遇到与我相同的情况 - 我收到与 OP 相同的消息的原因是我的 data-provider 函数是 private
.
我将其更改为 public
,一切都开始工作了。
我在这里谈论 data-provider:
/**
* @dataProvider myProvider
* @return void
*/
public function testGetWhatever()
{
$this->assertTrue(true);
}
public function myProvider()
{
return ...;
}