Maison  >  Article  >  développement back-end  >  Méthodes et exemples de test de script PHP

Méthodes et exemples de test de script PHP

墨辰丷
墨辰丷original
2018-06-07 17:26:404503parcourir

Cet article présente principalement les méthodes de test et des exemples de scripts PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

1. Exemples de tests courants

Nous rencontrons souvent cette situation : réécrire et tester du code existant qui n'a été testé d'aucune façon, et même ces codes sont toujours écrits en utilisant l'orientation objet. Pour tester du code comme celui-ci, mon conseil est de diviser le code en morceaux afin qu'il soit plus facile à tester.

Cependant, ces codes hérités ne sont pas si faciles à refactoriser. Par exemple, vous ne pouvez pas réécrire le code avant de tester. Ceci afin d'éviter d'affecter le programme d'origine, et bien sûr, il n'est pas facile d'effectuer des tests unitaires.

Dans les programmes PHP, une partie du code est généralement écrite dans plusieurs fichiers index.php et script.php, et ces fichiers .php sont stockés dans plusieurs dossiers différents. Si leurs points d’entrée ne sont pas trouvés, ils ne sont pas accessibles directement par le serveur web.

Test de copie

Pour tester un script PHP, nous devons simuler une requête HTTP et vérifier si la réponse renvoyée est égale à la valeur attendue. Ce qu'il faut noter ici, c'est simuler une requête et définir la réponse et la requête. Non seulement les contenus sont différents, mais leurs en-têtes sont également différents.

De plus, si nous voulons tester un script de transaction qui manipule des données, nous voulons nous assurer que nous ne le laissons pas se connecter à la base de données réelle ou au reste de l'application.

En réalité, personne ne réécrira généralement directement le script PHP original à des fins de test. Parce que j'ai peur de rendre le code irrécupérable. Je recommande d'utiliser une copie du script PHP afin que nous puissions effectuer quelques opérations mineures sur le code PHP.

Comment apporter des modifications minimes au code : supprimez les instructions include et require (si elles ne sont pas utilisées), et modifiez la façon dont les fonctions internes sont appelées, par exemple : écrivez header() sous la forme $object-> en-tête() .

Enfin, testons ce script de transaction. Après les tests, nous pouvons les extraire du script en double et les placer dans un nouveau fichier de script.

Étapes spécifiques

1. Simulez une requête HTTP et redéfinissez les variables $_GET et $_POST, et modifiez également l'en-tête de $_SERVER.

2. Obtenez la réponse à la demande. Le corps de la réponse peut être capturé via ob_start() et ob_get_clean(). Il peut collecter chaque sortie de tampon (contenu du tampon) avec echo() ou avec c4a03c0500b613ee8a11f9aad5bb6417header().

Code spécifique

Il s'agit de l'objet de script de transaction que nous voulons tester. Spécifique au script, nous devons également encapsuler :

<?php
class ForumPosting
{
  private $headers = array();
 
  public function handleRequest($postRequest)
  {
    $_POST = $postRequest;
    $connection = $this->getAConnection();
    ob_start();
    include &#39;forum/post_new_copy.php&#39;;
    $content = ob_get_clean();
    return array(
      &#39;content&#39; => $content,
      &#39;headers&#39; => $this->headers
    );
  }
 
  private function header($headerLine)
  {
    $this->headers[] = $headerLine;
  }
   
  ...
}
Voici notre code de test :

 public function testANewPostIsCreated()
{
  $action = new ForumPosting();
  $response = $action->handleRequest(array(
    &#39;id_thread&#39; => 42,
    &#39;text&#39; => &#39;Hello, world&#39;,
    ...
  ));
  $this->assertEquals(&#39;...&#39;, $response[&#39;content&#39;]);
  $this->assertContains(&#39;Content-type: text/html&#39;, $response[&#39;headers&#39;]);
}
La copie de test n'est que temporaire ! Cela nous permet d'écrire des tests qui ne changent pas. Enfin, nous refactoriserons les scripts PHP qui ont réussi le test pour éliminer le code redondant.

Une fois notre test terminé, le contenu de handleRequest() peut être remplacé par du vrai code logique. Si vous souhaitez écrire de nombreux scripts de test de ce type, vous pouvez écrire un objet de test général pour répondre à vos besoins de test.

2. Boîte à outils de tests unitaires pour les développeurs PHP

Dans le domaine PHP, il existe trois principaux outils de tests unitaires : PHPUNIT, PHPUNIT2 et SimpleTest. Parmi eux, PHPUNIT est très simple dans sa fonction et n'est pas parfait ; PHPUNIT2 est un outil de test unitaire spécialement écrit pour PHP5, qui est conforme à Junit dans sa structure et sa fonction, et SimpleTest est un outil de test très pratique, et webTest prend en charge les tests de ; L'interface du programme Web est l'outil de test le plus recommandé par Easy. Dans cet article, nous choisissons SimpleTest pour l'introduction.

Connaissances associées : PHPUNIT2 est également un très bon outil, notamment en termes d'architecture. Il y a beaucoup de choses qui méritent d'être soulignées. J'espère avoir l'occasion de le partager avec vous dans un article dédié dans le futur.

SimpleTest : C'est juste que Simple

L'installation de SimpleTest est très simple. Téléchargez simplement un package de code source depuis sf.net, puis décompressez-le dans le répertoire Web et vous pourrez l'utiliser. je n'entre pas dans les détails ici.

Regardons d'abord un exemple : rédigez un test pour vérifier si un site Web est accessible.

Nous introduisons d'abord les fichiers à utiliser :

Liste de codes :

require_once("../simpletest/unit_tester.php");
require_once("../simpletest/web_tester.php");
require_once("../simpletest/reporter.php");
Ensuite nous créons une classe de test :

Liste de codes :

class TestOfSite extends WebTestCase
{
  function TestOfSite()
  {
    $this->WebTestCase("测试");
  }

  function testSite()
  {
    $this->get("http://howgo.net/prettyface/display.php");
    $this->assertTitle(".: facebook :.");
  }
}
Nous étendons d'abord la classe webTestCase afin que nous puissions automatiquement obtenir la possibilité de tester le Web. Ensuite, dans le constructeur, nous utilisons directement la classe de base et lui passons simplement le titre. Ensuite, nous devrions écrire la méthode de test. Les méthodes de test commencent toutes par "test" pour identifier les méthodes de la classe qui doivent être appelées lorsque nous exécutons le test.

Et $this-> get obtiendra le contenu de la page web, on précise son titre comme ".: facebook:.", et il ne reste plus qu'à instancier l'objet de cette classe et à l'exécuter

.

代码列表:

$test = &new TestOfSite();
$test->run(new HtmlReporter());

下边是运行结果:

如果测试出错则会出现下边的界面:

到这里一个简单的测试就算完成了。

实战演习 – 一个Login测试

下面我们进入实战,在这个基础上完成一个login的测试。这次我们先贴出完整的代码:

代码列表:

require_once("../simpletest/unit_tester.php");
require_once("../simpletest/web_tester.php");
require_once("../simpletest/reporter.php");

class TestOfLogin extends WebTestCase
{
  function TestOfLogin()
  {
    $this->WebTestCase("Login测试");
  } 

  function testLoginOk()
  {
    // 取得页面
    $this->get("http://howgo.net/prettyface/login.php");

    // 添加测试表项
    $this->setField("name","Easy");
    $this->setField("pass","******");

    // 提交
    $this->clickSubmit("提交");

    // 察看提交后返回页面是否正确
    $this->assertWantedPattern("/成功登录/");

    // 点击页面链接
    $this->clickLink("点击这里进入管理页面");

    // 察看指定页面标题和关键内容
    $this->assertTitle("ADMINCP");
    $this->assertWantedPattern("/请选择要进行的任务/");

    // 退出登陆
    $this->clickLink("退出管理");
    $this->clickLink
  }
}

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP实现获取上月、本月、近15天、近30天的方法

PHP+Ajax实现的无刷新分页功能的方法

PHP 实现返回数组后的处理方法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn