2020-05-27 18:46:16 +02:00
|
|
|
# Running Application Tests
|
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
This is the quick-start to CodeIgniter testing. Its intent is to describe what
|
2020-10-22 17:41:59 +00:00
|
|
|
it takes to set up your application and get it ready to run unit tests. It is
|
|
|
|
not intended to be a full description of the test features that you can use to
|
|
|
|
test your application. Those details can be found in the documentation.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Resources
|
2020-08-04 11:25:22 +00:00
|
|
|
|
|
|
|
- [CodeIgniter 4 User Guide on Testing](https://codeigniter4.github.io/userguide/testing/index.html)
|
2021-05-06 14:00:48 +00:00
|
|
|
- [PHPUnit docs](https://phpunit.readthedocs.io/en/8.5/index.html)
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Requirements
|
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
It is recommended to use the latest version of PHPUnit. At the time of this
|
2021-05-06 14:00:48 +00:00
|
|
|
writing we are running version 8.5.13. Support for this has been built into the
|
2020-08-04 11:25:22 +00:00
|
|
|
**composer.json** file that ships with CodeIgniter and can easily be installed
|
2020-10-22 17:41:59 +00:00
|
|
|
via [Composer](https://getcomposer.org/) if you don't already have it installed
|
|
|
|
globally.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
> composer install
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
If running under OS X or Linux, you can create a symbolic link to make running
|
|
|
|
tests a touch nicer.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
> ln -s ./vendor/bin/phpunit ./phpunit
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
You also need to install [XDebug](https://xdebug.org/index.php) in order for
|
|
|
|
code coverage to be calculated successfully.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Setting Up
|
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
A number of the tests use a running database. In order to set up the database
|
|
|
|
edit the details for the `tests` group in **app/Config/Database.php** or
|
|
|
|
**phpunit.xml**. Make sure that you provide a database engine that is currently
|
|
|
|
running on your machine. More details on a test database setup are in the
|
2020-08-04 11:25:22 +00:00
|
|
|
_Docs>>Testing>>Testing Your Database_ section of the documentation.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
If you want to run the tests without using live database you can exclude
|
|
|
|
@DatabaseLive group. Or make a copy of **phpunit.dist.xml** - call it
|
|
|
|
**phpunit.xml** - and comment out the <testsuite> named "database". This will
|
|
|
|
make the tests run quite a bit faster.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Running the tests
|
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
The entire test suite can be run by simply typing one command-line command from
|
|
|
|
the main directory.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
> ./phpunit
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
You can limit tests to those within a single test directory by specifying the
|
|
|
|
directory name after phpunit.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
> ./phpunit app/Models
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Generating Code Coverage
|
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
To generate coverage information, including HTML reports you can view in your
|
|
|
|
browser, you can use the following command:
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
> ./phpunit --colors --coverage-text=tests/coverage.txt --coverage-html=tests/coverage/ -d memory_limit=1024m
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
This runs all of the tests again collecting information about how many lines,
|
2020-10-22 17:41:59 +00:00
|
|
|
functions, and files are tested. It also reports the percentage of the code that
|
|
|
|
is covered by tests. It is collected in two formats: a simple text file that
|
|
|
|
provides an overview as well as a comprehensive collection of HTML files that
|
|
|
|
show the status of every line of code in the project.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
The text file can be found at **tests/coverage.txt**. The HTML files can be
|
|
|
|
viewed by opening **tests/coverage/index.html** in your favorite browser.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## PHPUnit XML Configuration
|
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
The repository has a `phpunit.xml.dist` file in the project root that's used for
|
2020-10-22 17:41:59 +00:00
|
|
|
PHPUnit configuration. This is used to provide a default configuration if you do
|
|
|
|
not have your own configuration file in the project root.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
The normal practice would be to copy `phpunit.xml.dist` to `phpunit.xml` (which
|
|
|
|
is git ignored), and to tailor it as you see fit. For instance, you might wish
|
|
|
|
to exclude database tests, or automatically generate HTML code coverage reports.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Test Cases
|
|
|
|
|
2020-08-04 11:25:22 +00:00
|
|
|
Every test needs a _test case_, or class that your tests extend. CodeIgniter 4
|
2020-05-27 18:46:16 +02:00
|
|
|
provides a few that you may use directly:
|
2020-08-04 11:25:22 +00:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
- `CodeIgniter\Test\CIUnitTestCase` - for basic tests with no other service
|
|
|
|
needs
|
2021-05-06 14:00:48 +00:00
|
|
|
- `CodeIgniter\Test\DatabaseTestTrait` - for tests that need database access
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
Most of the time you will want to write your own test cases to hold functions
|
|
|
|
and services common to your test suites.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
## Creating Tests
|
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
All tests go in the **tests/** directory. Each test file is a class that extends
|
|
|
|
a **Test Case** (see above) and contains methods for the individual tests. These
|
|
|
|
method names must start with the word "test" and should have descriptive names
|
|
|
|
for precisely what they are testing: `testUserCanModifyFile()`
|
|
|
|
`testOutputColorMatchesInput()` `testIsLoggedInFailsWithInvalidUser()`
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
Writing tests is an art, and there are many resources available to help learn
|
|
|
|
how. Review the links above and always pay attention to your code coverage.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
|
|
|
### Database Tests
|
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
Tests can include migrating, seeding, and testing against a mock or
|
|
|
|
live<sup>1</sup> database. Be sure to modify the test case (or create your own)
|
|
|
|
to point to your seed and migrations and include any additional steps to be run
|
|
|
|
before tests in the `setUp()` method.
|
2020-05-27 18:46:16 +02:00
|
|
|
|
2020-10-22 17:41:59 +00:00
|
|
|
<sup>1</sup> Note: If you are using database tests that require a live database
|
|
|
|
connection you will need to rename **phpunit.xml.dist** to **phpunit.xml**,
|
|
|
|
uncomment the database configuration lines and add your connection details.
|
|
|
|
Prevent **phpunit.xml** from being tracked in your repo by adding it to
|
|
|
|
**.gitignore**.
|