Я использую PHPUnit 4.2.2 внутри локальной установки Composer. Я также использую PHP CodeSniffer 2.2.0.
Я написал этот тестовый модуль:
<?php
include_once 'animals/Cat.php';
class CatAgeTest extends PHPUnit_Framework_TestCase{
public function testTrueIsTrue(){
$kittyAgeTest = new Cat("steak");
$result = $kittyAgeTest->getAge() >=5 && $kittyAgeTest->getAge() <= 10;
$this->assertTrue($result);
}
}
?>
Проходит, пока я не поменяю имя метода. Это единственное, что я изменил, и я пробовал много разных имен. Вот пара примеров:
testCatAgeBetweenFiveAndTen
catAgeTest
catAgeShouldBeBetweenFiveAndTen
… и так далее.
Вот мой phpunit.xml:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php" colors="true">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
</phpunit>
У меня есть несколько других модульных тестов — в разных проектах, с одинаковой конфигурацией — на одном компьютере. Я пытался изменить их имена, но это не приводит к их провалу.
Я использовал эти команды для запуска модуля php:
vendor/bin/phpunit
vendor/bin/phpunit tests/CatAgeTest.php
Вот мой файл composer.json (на всякий случай, если это поможет):
{
"require": {
},
"require-dev": {
"phpunit/phpunit": "4.2.2",
"squizlabs/php_codesniffer": "2.2.0"},
"autoload": {
"psr-0": {
"animals": ""}
}
}
Любая помощь будет принята с благодарностью!
Редактировать:
Вот мой файл Cat.php:
<?php
include_once("Animal.php");
class Cat extends Animal{
protected $name;
protected $species;
protected $speakCount;
protected $age;
public function __construct($name = "MewMew") {
$this->name = $name;
$this->age = rand(5, 10); // Random age
$this->species = "Feline"; // For testing in the DB
$this->namesHist = array(); // Names history
array_push($this->namesHist, $name);
}
public function getAge(){
return $this->age;
}
public function getSpecies(){ // For testing in the DB
return $this->species;
}
public function speak($word = "Meow.") { // Spoken word and word count
$this->speakCount += 1;
$this->speakCount % 5 == 0 ? $this->age += 1 : $this->age;
return $word;
}
public function getSpeakCount() {
return $this->speakCount;
}
public function setName ($newName) {
$this->name = $newName;
array_push($this->namesHist, $newName);
}
public function getNames() {
return $this->namesHist;
}
public function getAverageNameLength() {
$nameLen=0;
foreach($this->namesHist as $i) {
$nameLen += strlen($i);
}
$avgNL = round($nameLen/(count($this->namesHist)), 2);
return "Average Name Length: " . $avgNL;
}
}
?>
… и вот мой файл Animal.php:
<?php
Class Animal {
protected $name;
protected $age;
protected $favoriteFood;
public function __construct($name, $age, $favoriteFood) {
$this->name = $name;
$this->age = $age;
$this->favoriteFood = $favoriteFood;
}
public function getName() {
return $this->name;
}
public function getAge() {
return $this->age;
}
public function getFavoriteFood() {
return $this->favoriteFood;
}
public function setName ($newName) {
$this->name = $newName;
}
public function setAge ($newAge) {
$this->age = $newAge;
}
public function setFavoriteFood($newFavoriteFood) {
$this->favoriteFood = $newFavoriteFood;
}
}
?>
Edit2:
Вот ошибка, которую я получаю:
PHPUnit 4.2.2 by Sebastian Bergmann.
Configuration read from /var/www/php/misc/ap/phpunit.xml
F
Time: 15 ms, Memory: 2.75Mb
There was 1 failure:
1) Warning
No tests found in class "CatAgeTest".
FAILURES!
Tests: 1, Assertions: 0, Failures: 1.
Предупреждение PHPUnit указывает на то, что в вашем тестовом классе нет методов тестирования.
1) Warning
No tests found in class "CatAgeTest".
PHPUnit будет принимать методы с именами, начинающимися с test*()
и имея public
видимость как методы испытаний. Также возможно объявить метод вне этого соглашения об именах с @test
Атрибут docblock для обозначения его в качестве метода тестирования.
Эти методы именования и описания соглашений документированы здесь
Тесты являются открытыми методами, которые называются test *.
Кроме того, вы можете использовать аннотацию @test в docblock метода, чтобы пометить его как тестовый метод.
Учитывая это требование, имя вашей попытки метода testCatAgeBetweenFiveAndTen()
должен быть допустимым методом тестирования для PHPUnit.
Ваши другие заявленные попытки присвоения имен не соответствуют требованию PHPUnit и не будут найдены (catAgeTest(), catAgeShouldBeBetweenFiveAndTen()
) если вы также не аннотируете их @test
атрибут:
/**
* @test
*/
public function catAgeTest(){
$kittyAgeTest = new Cat("steak");
$result = $kittyAgeTest->getAge() >=5 && $kittyAgeTest->getAge() <= 10;
$this->assertTrue($result);
}
Других решений пока нет …