PHPUnit - 'No tests executed' when using configuration file
PhpUnit TestingPhpunitPhp Problem Overview
The Problem
To improve my quality of code, I've decided to try to learn how to test my code using Unit Testing instead of my mediocre-at-best testing solutions.
I decided to install PHPUnit using composer for a personal library that allows me to achieve common database functions. At first I didn't have a configuration file for PHPUnit and when I ran commands like:
$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest
Please note that this is a terminal command, so I didn't include the .php
extension. The GeneralStringFunctionsTest referred to above is actually a GeneralStringFunctionsTest.php
file.
The output is what I expected:
> Time: 31 ms, Memory: 2.75Mb
> OK (1 test, 1 assertion)
I then tried to use a configuration file to automatically load the test suite instead of having to manually type in the file every time. I created a file called phpunit.xml
in my root directory, and entered the following into the file: http://pastebin.com/0j0L4WBD:
<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
<testsuites>
<testsuite name="Tests">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
Now, when I run the command:
phpunit
I get the following output:
> 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!
In case it's helpful, my directory structure is as follows:
src - Top level directory (with all my source code)
tests - Top level directory (with all my tests, structured the same as my src folder)
vendor - Composer third party files
I also have the composer json and lock file, as well as the phpunit xml file in the top level as files.
#Things I've Tried#
- Changing the directory in
phpunit.xml
totests/GeneralStringFunctions
- Changing the directory in
phpunit.xml
to./tests
- Moving the
phpunit.xml
file to thetests
directory and then changing the directory to be./
instead oftests
. - Adding a suffix attribute to the directory tag in
phpunit.xml
to specify "Tests" as the explicit suffix.
Php Solutions
Solution 1 - Php
For what it's worth (being late), I ran into this recently while I was making a new Laravel 5.1 project for a simple website. I tried to debug it and was confused when I tried:
php artisan make:test homeTest
(which has a default test that just asserts true is true)
and saw the output
No tests executed!
What the problem ended up being for me was related to my PHP installation -- "phpunit" was globally registered and configured differently, whereas the phpunit that came with the Laravel installation was configured just right and ran perfectly.
So the fix is running the vendor's configured phpunit (from the same root directory as app/ and tests/):
./vendor/bin/phpunit
Hope that helps someone else!
Solution 2 - Php
Your XML file is fine as it is. However, you have to make sure that the PHP files in your tests/
folder are named as follows:
tests/Test.php <--- Note the uppercase "T"
tests/userTest.php
tests/fooBarTest.php
etc.
The filenames must end with "Test.php". This is what PHPUnit is looking for within directories.
Furthermore, every test method must either have a name that starts with "test" OR an @test
annotation:
public function testFooBar()
{
// Your test code
}
or:
/**
* @test
*/
public function fooBarTest() {
// test code here
}
Hope that helps!
Solution 3 - Php
On windows use the following command on terminal
.\vendor\bin\phpunit
that's if the command
phpunit
returns "No tests executed!"
while on Mac
./vendor/bin/phpunit
Hope it helps.
Solution 4 - Php
I had the same problem after PHPUnit on our virtual machines updated to version 6. Even --debug and --verbose said nothing useful, just "No tests executed". In the end it turned out that classes and namespaces were changed in the new version and it just didn't want to execute the files that contained references to old classes. The fix for me was just to replace in every test case this:
class MyTestCase extends \PHPUnit_Framework_TestCase {...}
with:
use PHPUnit\Framework\TestCase;
class MyTestCase extends TestCase {...}
Solution 5 - Php
I realize this is super old, but it just happened to me too. Hopefully this will help someone.
My problem was that I forgot the '@' symbol in /** @test */
WRONG:
/** test */
function a_thread_can_be_deleted()
{
...
}
RIGHT:
/** @test */
function a_thread_can_be_deleted()
{
...
}
Solution 6 - Php
I pulled my hair for 10 minutes before i decided to use --debug (good way to go by the way) to discover the simple fact that file name didn't respect the naming convention, i had an extra "s" at the end.
wrong
CreateAdminTests
right
CreateAdminTest
hope this note could help for someone
Solution 7 - Php
Came late to the party, but this info may help others.
Above solutions did not work for me. As of Laravel 7.x, by default, PHPUnit executes only PHP files which are suffixed with "Test.php". For example if you create a test, naming it CreateUser
will not work, whereas naming it CreateUserTest
will work.
To overcome the limitation, go to phpunit.xml
and modify suffix
attribute from directory
elements:
...
<testsuite name="Unit">
<!-- modify suffix -->
<directory suffix=".php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<!-- modify suffix -->
<directory suffix=".php">./tests/Feature</directory>
</testsuite>
...
This will instruct PHPUnit to run all files with .php
extension from directories. Note to clear app's cache after updating phpunit.xml
:
php artisan config:cache
Additional information about PHPUnit XML configuration can be found here: https://phpunit.de/manual/6.5/en/appendixes.configuration.html
Solution 8 - Php
You Need Just To Call It From Vendor File
vendor\bin\phpunit
Notice \ Not /
Solution 9 - Php
Instead of run phpunit
use
vendor\bin\phpunit
Solution 10 - Php
if you are using PHPSTORM go to Settings then goto
-
Test Frameworks
and click + and choose
-
PHPUnit Local
then -
Use Composer Auto Loader
then paste this like in path to script field -
C:\{YOUR PROJECT NAME}\vendor\autoload.php
-
click OK
-
HAPPY TESTING
Solution 11 - Php
Check phpunit.xml file, look inside testsuites.
My version of phpunit (2019) is looking for files ending (suffix) *Test.php . So, make sure all the test files are named properly (ex.: BookTest.php is correct, BookTests.php is not, BookTestCase.php is not).
Solution 12 - Php
The function names in the test file must either be prefixed with test
or there should be a comment added before function
/** @test */
Make sure that it is not
/* @test */
because that doesn't work. there needs to be two asterisks after slash not one.
Solution 13 - Php
I had the same issue and I found all my configs and syntaxs were OK. I don't know why but simply adding the word "tests" (in plural), which is the name inside the App folder containing all tests, worked to me pretty well:
[terminal] vendor/bin/phpunit tests
If my alias works with plain "phpunit" I would do the same
[terminal] phpunit tests
Same with filters
[terminal] vendor/bin/phpunit --filter 'Tests\\Routes\\AnyTest' Tests
Notice that "tests" at the end is in plural as is the same folder name inside App folder.
Hope it help and save time to someone else.
Best regards
Solution 14 - Php
if you don't have Test Class
php artisan make:test TestName //default is future testing
php artisan make:test TestName --unit //for unit testing
then you will find the test file in your test folder under subfolder unit or future if you want to execute all the test files use
note: for testing, you can edit your phpuint.xml file the best approach is if you
use sqlite to set that up got to
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
you can execute your test file using vendor/bin/PHPUnit //this will execute every test file vendor/bin/PHPUnit if you wish to execute a single function you can use the
vendor/bin/PHPUnit --filter function_name or classname
and lastly, use /** @test*/ in every test in order for you PHPUnit to know this is a test
Solution 15 - Php
Have you added a test suite to you phpunit.xml file?
<phpunit>
<testsuite name="app1" >
<directory>./</directory>
</testsuite>
</phpunit>
You can add multiple directories in there.
Solution 16 - Php
the class and file name has no Test in them e.g "AuthorizationTest"
Solution 17 - Php
For me, using phpunit --debug showed me which test it was not executing, inside, I had
$this->visit('/')
->see('Laravel');
and I think because the directory was protected with .htaccess authentication, it could not get through to visit the page
The solution for me was to take out this test (or most likely take out .htaccess authentication)
Solution 18 - Php
Mine was a bit funny.
When I used php artisan make:test
I accidentally put .php like ProductRewardPointController.php
which created ProductRewardPointController.php.php
and phpunit simply ignored it.
I just delete the extra .php and things back to normal
Solution 19 - Php
This is very late but I hope it helps someone.
I got my tests to run by using an absolute reference. folder structure [ project/tests/test.php]
my directory line looked like this
Solution 20 - Php
A little bit on the side maybe, but if you are (like me) using Laravel in Vagrant, make sure you are running phpunit inside of the vagrant box and not on the "windows side". :)
Solution 21 - Php
I had the issue of no tests being executed, even when things were set up fine.
The cause was the namespace was not the first command of the file, it was after some doc-block comments.
reverting caused phpunit to see the tests and run correctly.
Solution 22 - Php
I had the same issue of No tests executed!, solved by keeping the same name of file and class name.
Solution 23 - Php
If you are using IDEs like JetBrains PHPStorm, please also notice that: in the Run/Debug Configurations
window, the Test scope
needs to be set to directory
and point that directory to where your tests
folder located.
It just took me half an hour to figure out I forgot to set the directory. You can use global phpunit.phar
as long as you set test scope and the directory correctly, the IDE will handle other stuff for you.
Solution 24 - Php
If you're using @dataprovider make sure the visibility of its method is public
that was my problem
Solution 25 - Php
For me with composer
it works with both ./vendor/bin/phpunit
and phpunit
, I dont have phpunit
installed globally.
the answer from @alext helped me to solved the issue.
So if you check the phpunit
manual by running phpunit -h
output:
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.
Usage: phpunit [options] UnitTest [UnitTest.php]
phpunit [options] <directory>
it requires a directory or file.
The [options]
are optional, you can pass them using phpunit.xml
file
Because your test is in tests
, So you should try with phpunit tests
If it doesnt work, let try with the sample from phpunit
here: https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html
Solution 26 - Php
In my case I added annotation @group active to my class
/**
* @group active
**/
Solution 27 - Php
There are many possible answers to this question.
In case someone gets into same situation as I did - the cause for me getting the same message as the OP, was that my data-provider function was private
.
I changed it to public
and it all started working.
I speak about the data-provider as in here:
/**
* @dataProvider myProvider
* @return void
*/
public function testGetWhatever()
{
$this->assertTrue(true);
}
public function myProvider()
{
return ...;
}
Solution 28 - Php
using de cmd console resolved this problem passing the enterely path Test realized
I did't find another way to do it It does not work from this way
I hope this was helpful for someone