Vous pouvez tester unitairement la procédure PHP, pas de problème. Et vous n'avez certainement pas de chance si votre code est mélangé avec du HTML. Au niveau de l'application ou du test d'acceptation, votre PHP procédural dépend probablement de la valeur des superglobaux ($_POST, $_GET, $_COOKIE
, etc.) pour déterminer le comportement, et finit par inclure un fichier modèle et cracher la sortie.
Pour effectuer des tests au niveau de l'application, vous pouvez simplement définir les valeurs superglobales; démarrer un tampon de sortie (pour empêcher le html d'envahir votre écran); appelle la page; affirmer contre des choses à l'intérieur du tampon; et trash le tampon à la fin. Donc, vous pourriez faire quelque chose comme ceci:
public function setUp()
{
if (isset($_POST['foo'])) {
unset($_POST['foo']);
}
}
public function testSomeKindOfAcceptanceTest()
{
$_POST['foo'] = 'bar';
ob_start();
include('fileToTest.php');
$output = ob_get_flush();
$this->assertContains($someExpectedString, $output);
}
Même pour d'énormes « cadres » avec beaucoup de comprend, ce genre de test vous dira si vous avez des caractéristiques au niveau des applications de travail ou non. Cela va être très important lorsque vous commencerez à améliorer votre code, car même si vous êtes convaincu que le connecteur de la base de données fonctionne encore et qu'il a l'air mieux qu'avant, vous devrez cliquer sur un bouton pour voir que oui, vous pouvez toujours connectez-vous et déconnectez-vous via la base de données.
Aux niveaux inférieurs, il existe des variations mineures en fonction de la portée variable et si les fonctions fonctionnent par effets secondaires (en retournant true ou false) ou en renvoyant le résultat directement.
Les variables sont-elles transmises explicitement, en tant que paramètres ou tableaux de paramètres entre les fonctions? Ou les variables sont-elles définies dans de nombreux endroits différents, et sont-elles transmises implicitement en tant que variables globales? Si c'est le cas (bien) explicite, vous pouvez tester une fonction en (1) incluant le fichier contenant la fonction, puis (2) en alimentant directement les valeurs de test de fonction, et (3) en capturant la sortie et en affirmant. Si vous utilisez des globals, vous devez juste faire très attention (comme ci-dessus, dans l'exemple $ _POST) pour annuler soigneusement tous les globals entre les tests. Il est également particulièrement utile de garder les tests très petits (5-10 lignes, 1-2 affirmations) lorsque vous travaillez avec une fonction qui pousse et tire beaucoup de globals.
Un autre problème fondamental est de savoir si les fonctions fonctionnent en retournant la sortie, ou en modifiant les paramètres passés, en renvoyant true/false à la place. Dans le premier cas, le test est plus facile, mais encore une fois, il est possible dans les deux cas:
// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertEquals($expectedOutput, $output);
}
Dans le mauvais cas où votre code fonctionne par des effets secondaires et retourne vrai ou faux, vous pouvez toujours tester assez facilement :
/* suppose your cat function stupidly
* overwrites the first parameter
* with the result of concatenation,
* as an admittedly contrived example
*/
public function testShouldConcatenateTwoStringsAndReturnTrue()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertTrue($output);
$this->Equals($expectedOutput, $stringOne);
}
Espérons que cela aide.
Cela ne va pas bien si le code que vous testez est jonché de 'exit;' déclarations :( –
@YarekT Aucun test ne peut bien se passer si le code est jonché d'instructions 'exit' ou' die'. gérer la terminaison de script attendue en lançant une exception et en enregistrant un gestionnaire d'exceptions personnalisé assez intelligent pour ignorer le type d'exception personnalisé lorsqu'il est rencontré.Vous pouvez ensuite tester que l'exception attendue est levée.Bien sûr, une application bien conçue ne devrait vraiment pas Je n'ai jamais besoin de 'quitter 'ou' mourir' après la phase bootstrap. – rdlowrey