TASK: Last changes for first talk

This commit is contained in:
Daniel Siepmann 2018-07-15 11:10:08 +02:00
parent d273405235
commit 0cc5df4e95
Signed by: Daniel Siepmann
GPG key ID: 33D6629915560EF4
5 changed files with 256 additions and 14 deletions

5
.gitignore vendored
View file

@ -4,3 +4,8 @@ index.php
typo3 typo3
/Tests /Tests
/Results /Results
infection*
phpunit.xml.dist
debug-log.txt
per-mutator.md
summary-log.txt

View file

@ -1,5 +1,5 @@
<?php <?php
namespace Codappix\Domain\Repository; namespace Codappix\TestingTalk\Domain\Repository;
/* /*
* Copyright (C) 2018 Daniel Siepmann <coding@daniel-siepmann.de> * Copyright (C) 2018 Daniel Siepmann <coding@daniel-siepmann.de>

View file

@ -1,5 +1,5 @@
<?php <?php
namespace Codappix\TestingTalkTests\Unit\Controller; namespace Codappix\TestingTalk\Tests\Unit\Controller;
/* /*
* Copyright (C) 2018 Daniel Siepmann <coding@daniel-siepmann.de> * Copyright (C) 2018 Daniel Siepmann <coding@daniel-siepmann.de>

View file

@ -21,5 +21,9 @@
"typo3/cms": { "typo3/cms": {
"web-dir": "web" "web-dir": "web"
} }
},
"require-dev": {
"phpunit/phpunit": "^6.5",
"infection/infection": "^0.9.0"
} }
} }

View file

@ -1,23 +1,45 @@
Testing Talk Testing Talk
============ ============
This is about automated testing, for PHP.
Everyone is testing already, by hand. This involves:
* Unit testing
* Functional testing
* Acceptance testing
* Browser testing
* …
All of the above is already done by you, so … NO PANIC!
This is "The Hitchhiker's Guide to […]" testing.
Table of contents:
.. contents:: :local:
Start
-----
Clean everything:: Clean everything::
rm -rf composer.lock vendor web Tests rm -rf composer.lock vendor web Tests phpunit.xml.dist infection.json.dist
Install dependencies Install dependencies using composer::
--------------------
Using composer:: composer install --no-dev
Installation development dependencies using composer::
composer install composer install
PHPUnit Installation This also includes composer, see: composer.json
--------------------
Install phpunit::
composer require --dev phpunit/phpunit ^6.5
Why 6.x? We use 6.x to support PHP 7.0. Why 6.x? We use 6.x to support PHP 7.0.
@ -25,6 +47,8 @@ Check installation::
./vendor/bin/phpunit --version ./vendor/bin/phpunit --version
./vendor/bin/phpunit Tests/Unit/
Links: Links:
* https://phpunit.de/ * https://phpunit.de/
@ -46,6 +70,14 @@ Execute the first test::
./vendor/bin/phpunit Tests/Unit/ ./vendor/bin/phpunit Tests/Unit/
Execute with colors::
./vendor/bin/phpunit --color Tests/Unit/
Execute with info about executed tests::
./vendor/bin/phpunit --color --debug Tests/Unit/
What's in the test? What's in the test?
------------------- -------------------
@ -65,6 +97,44 @@ Create test for controller
Introduction to mocking Introduction to mocking
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
What is mocking, or a mock?
In object-oriented programming, mock objects are simulated objects that mimic the
behavior of real objects in controlled ways.
A programmer typically creates a mock object to test the behavior of some other
object, in much the same way that a car designer uses a crash test dummy to
simulate the dynamic behavior of a human in vehicle impacts.
— https://en.wikipedia.org/wiki/Mock_object
* https://phpunit.de/manual/6.5/en/test-doubles.html
* https://en.wikipedia.org/wiki/Mock_object
Example mock:
.. code-block:: php
<?php
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
class Test extends TestCase
{
public function someTest()
{
$viewMock = $this->getMockBuilder(ViewInterface::class)->getMock();
$viewMock->expects($this->once())
->method('assign')
->with('frontendUser', $frontendUserMock);
}
}
?>
Add the test Add the test
^^^^^^^^^^^^ ^^^^^^^^^^^^
@ -77,7 +147,7 @@ We want to test the controller now::
Execute all tests:: Execute all tests::
./vendor/bin/phpunit Tests/Unit/ ./vendor/bin/phpunit --color --debug Tests/Unit/
Alternative output Alternative output
------------------ ------------------
@ -85,7 +155,7 @@ Alternative output
testdox testdox
Used as "agile" output:: Used as "agile" output::
./vendor/bin/phpunit Tests/Unit/ --testdox-html Results/testdox.html ./vendor/bin/phpunit Tests/Unit/ --color --testdox-html Results/testdox.html
xdg-open Results/testdox.html xdg-open Results/testdox.html
xml xml
@ -101,3 +171,166 @@ html Coverage
Benefits of tests Benefits of tests
----------------- -----------------
#. Detect new bugs.
#. Make sure the same bug does not occur a 2nd time.
#. Reproduce bug.
#. Speed up development.
#. Show how to use the written code.
#. Allow co-worker, in pull request, to see what you expect.
And how you understood the feature-request.
#. Write code without working system, by using tests instead.
#. Allow more secure refactoring.
Automate test execution
-----------------------
Existing tests are great. If they are executed.
Tests which exist are code, if they are not executed, they are dead code.
Tests costs money, so get the money back by executing tests.
The easiest way is to have an CI (=Continuous Integration).
E.g.:
* Jenkins
* Travis
* Gitlab CI
* Bitbucket Pipelines
* Bamboo
* Circle CI
* …
See: https://awesomelists.top/#/repos/ciandcd/awesome-ciandcd
Use `phpunit.xml.dist`::
cp Resources/Private/Configs/phpunit.xml.dist phpunit.xml.dist
./vendor/bin/phpunit
Metrics
-------
Code Coverage
^^^^^^^^^^^^^
Most of the time counts only number of executed lines.
This helps to find untested code, nothing more!
100% covered lines does not mean you are testing all circumstances,
just every line at least once.
E.g.:
.. code-block:: php
<?php
if ($var1 || $var2) {
echo 'test';
}
?>
Will have 100% if all lines are executed, that is even if we do not provide `$var2`.
We have to test the possible cases, not only all lines.
* https://stackoverflow.com/a/90021/1888377
* https://www.martinfowler.com/bliki/TestCoverage.html
* https://phpunit.de/manual/6.5/en/code-coverage-analysis.html
Crap
^^^^
Is not:
https://img.devrant.com/devrant/rant/r_1046201_T68wf.jpg
— https://devrant.com/search?term=code+reviews
Is: change risk anti pattern score
Combines complexity and test coverage.
Different kinds of tests
------------------------
* https://stackoverflow.com/a/4145576/1888377
* http://www.getlaura.com/testing-unit-vs-integration-vs-regression-vs-acceptance/
* https://en.wikipedia.org/wiki/Category:Software_testing
Lists: Acid tests, Unit testing, A/B testing, Acceptance testing, Ad hoc testing,
Agile testing, All-pairs testing, API testing, Black-box testing & White-box
testing, Boundary testing, Cloud testing, Compatibility testing, Component-based
usability testing, …
Unit Tests
^^^^^^^^^^
What we did above. White box test of small pieces of code.
Functional Tests
^^^^^^^^^^^^^^^^
Involves multiple code parts, database, file system and further components, e.g. web
server.
Acceptance Tests
^^^^^^^^^^^^^^^^
Tests from user view, e.g. via browser.
Mutation testing
^^^^^^^^^^^^^^^^
Tests how easy it is to break test::
cp Resources/Private/Configs/infection.json.dist infection.json.dist
./vendor/bin/infection
* https://infection.github.io/
* https://infection.github.io/guide/mutators.html
* https://en.wikipedia.org/wiki/Mutation_testing
Summary
-------
Start writing tests, small unit tests.
Automate execution of tests.
Improve.
Further reading
---------------
* https://phpunit.de/
* https://awesomelists.top/#repos/ziadoz/awesome-php
* https://en.wikipedia.org/wiki/Category:Software_testing
* Source code of open source projects, like TYPO3:
https://github.com/TYPO3/TYPO3.CMS/tree/master/typo3/sysext/core/Tests