8
votes

Conditions d'erreur de freinage dans la bibliothèque MySQLI

J'ai une variété de scripts PHP qui utilisent la suite mysqli de fonctions pour accéder à une base de données. J'ai écrit ces scripts pour gérer les différentes conditions d'erreur (E.g. mysqli_stmt_execute renvoyant false).

Y a-t-il un moyen simple de simuler ces conditions d'erreur à Verifty que la sortie reçue par l'utilisateur est approuve pour ces conditions?


0 commentaires

4 Réponses :


0
votes

Si vous n'êtes pas dans un environnement de production, la meilleure façon de le faire évolue les différents paramètres de la base de données de votre PHP.

  • Modifiez le mot de passe de la base de données pour voir comment vous gérez les erreurs de connexion
  • Modifiez vos structures de table pour voir comment vous gérez les erreurs de requête
  • Essayez de voir ce qui se passe avec des caractères spéciaux (ex: буква) dans vos requêtes

4 commentaires

Ce sont tous des cas de test valides mais répond-il à la question? Ce sont toutes des conditions réelles que vous avez appliquées physiquement, il n'y a pas FAÇON impliqué.


@ Nickl- à mon avis C'est la voie la plus proche. Changer le numéro de port Fake une erreur de connexion. Changer la structure des tables faux une erreur de requête. L'objectif est de tester que "la sortie reçue par l'utilisateur est approuve pour ces conditions" il sera assez bon.


Ce que vous n'éceptez pas, c'est le fait que ce ne sont pas une fois hors des tests, vous devrez faire tout ce saut, sauter et sauter pour chaque libération. avec les moqueurs que vous pouvez vérifier après chaque commit. Il n'y a aucun moyen que vous puissiez couvrir tous les scénarios qui tirent des câbles et de laisser tomber des tables, avec les moqueurs Il n'y a aucun moyen que nous manquons rien. =)


@ Nickl- Je n'ai jamais pensé à une telle solution. C'est une excellente méthode



1
votes

Si vous recherchez des tests automatisés, la meilleure façon d'aller (avec PHP) est Phpunit .

avec PHPUnit, vous pouvez écrire des tests d'unité (affirmations notamment) qui vous permettent de vérifier que la sortie reçue par l'utilisateur est appropriée dans toutes les conditions différentes.


0 commentaires

8
votes

Si vous utilisez les classes MySQLI.

Par exemple: P>

<?php
    namespace my_faking_namespace {
        function mysqli_stmt_execute($stmt) 
        {
            return false;    
        }

        $mysqli = mysqli_connect("localhost", "user", "password", "db");
        $query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
        $stmt = mysqli_prepare($mysqli, $query);
        if (false === mysqli_stmt_execute($stmt)) {
            echo "Oops! some_value for same_field in some_table returned false";
        }
    }


0 commentaires

0
votes

Peut-être que vous posez la mauvaise question: pourquoi votre logique commerciale principale dépend-elle des bibliothèques / API tiers? Avez-vous entendu parler de la soi-disant Architecture d'oignon ? Superposer votre application plus le long de ces lignes - domaine, entreprise, infrastructure / tests - vous donne une tentative beaucoup plus facile à tester les choses qui ne changeront pas: votre logique professionnelle.

Cependant, puisque PHP est une langue dynamique dactylographiée, La moqueur est essentiellement libre. Tant que vous utilisez des fonctionnalités OO et non les fonctions globales, tout ce que vous devez créer du code testable est un moyen d'injecter une fausse manche de base de données dans votre code. Un excellent moyen consiste à ajouter un paramètre db à vos fonctions / méthodes. Quelque chose de trivial comme celui-ci: xxx

puis, dans vos tests d'unité qui couvrent updateStuff , transmettez-le dans un objet maquette en tant que $ dB paramètre.


0 commentaires