8
votes

Comment tester un programme de planification dans PHP

J'ai une application de codeigniter qui planifie des événements pour des dates et des heures spécifiques dans une DB mySQL, parfois des semaines à l'avance, avec une autre partie qui enverra des rappels par courrier électronique et effectuera d'autres actions lorsque ces dates se produisent. Comment approcherait-on des tests basés sur le temps? Y a-t-il une suite de test que je pourrais utiliser ou lire?


7 commentaires

Créez une classe qui fournit du temps à votre script et de vous moquer.


Si rien d'autre aide, changez la date du système sur votre serveur. Mais @zerkms a proposé un meilleur moyen.


Ou vous pourriez réduire la plage de temps en minutes. Si cela fonctionne avec des minutes, cela fonctionne avec des mois. Rester simple.


Zerkms, voudriez-vous vous en développer? Je ne suis pas vraiment familier avec la moqueur.


mock signifie juste "faire semblant", c'est-à-dire que le serveur pense que c'est le bon moment pour exécuter votre script.


Pourriez-vous nous dire quelle "application" vous utilisez ou postez un code


Whispersan, merci d'avoir répondu. Ma question dans ce cas n'est pas spécifique au code. Je suis plus intéressé à voir en termes généraux, peut-être un pseudocode comment les autres planifieraient cela les tests. Par exemple "Créez une classe qui fournit du temps à votre script et de se moquer de cela", pourrait-on me montrer ce que cette classe ressemblerait et comment le faire interagir avec votre contrôleur de codeigniter moyen


4 Réponses :


1
votes

Voulez-vous exécuter un test d'unité pour vérifier que votre code fonctionne ou testez un environnement de production?

Si vous souhaitez vous assurer que vos tâches planifiées sont en cours d'exécution ... Celui que j'ai créé écrit un journal à chaque fois qu'il complète avec succès l'exécution.

Ensuite, nous le testons en vérifiant si elle est exécutée (par exemple: test si «quotidien» les tâches sont exécutées dans les 36 heures). S'ils n'ont pas fonctionné, nous alertons un administrateur.


1 commentaires

Je veux avoir une manière organisée de changer la date et l'heure que l'application voit, afin de tester des événements de temps basés sur le temps et des actions résultantes de l'application.



5
votes

C'est quelque chose que je réfléchis depuis un certain temps - et puis j'ai réalisé mon problème! Je me concentrais à temps comme si c'était quelque chose que je ne pouvais pas contrôler et mesurer. Le temps est tout comme n'importe quel autre calcul qui se produit dans nos applications. Ainsi, des tests basés sur le temps sont faciles - nous devons simplement changer la façon dont nous y réfléchissons - et comment nous construisons notre application.

Tout d'abord, la première chose à faire est de séparer la séquence de génération d'heure actuelle à un méthode. De cette façon, nous pouvons se moquer de cela plus tard (c'est-à-dire générer notre propre méthode qui renvoie toujours un «temps» prédéterminé pour les tests). Cela peut être aussi simple que quelque chose comme ... xxx

Quel est l'avantage: Dans notre code, nous allons appeler cela pour obtenir le temps actuel pour effectuer des calculs. Cependant, lors des tests, nous pouvons toujours générer exactement le même temps.

c'est important - nous pouvons toujours générer exactement le même temps, à chaque fois.

Maintenant, je ne suis pas totalement certain de savoir comment mettre cela en pratique dans votre application particulière, mais laissez-moi vous expliquer une application «fausse» - et voir si vous pouvez l'adapter à vos spécifications.

OK, d'abord Off, nous avons cette méthode qui met une entrée dans notre base de données qui est un «rappel» pendant 3 semaines à partir de maintenant.

Ceci est l'ancien code xxx

Alors, comment testons-nous cela? Cela va évidemment être différent à chaque fois?

Eh bien, brisons-le. Ceci est notre nouveau code ...

nouveau code xxx

maintenant, quand il s'agit de tester ... vous peut configurer votre test DB. Ensuite, ma moquez la méthode _getCurrentTime () pour toujours retourner un entier que vous connaissez. Ensuite, exécutez l'addremindertoDB () (il utilisera cet entier que vous connaissez). Enfin, interrogez la source de données pour valider la ligne insérée a les valeurs appropriées que vous attendez.

Je sais que ce n'est pas exactement sur ce que vous demandez, mais la question est une sorte de vague aussi : - Bonne chance!


1 commentaires

Merci Aaron. Je pensais que c'était la réponse la plus complète - Bill



1
votes

Utilisez-vous des tâches cron, PHP Live Scripts ou JavaScript? Il existe de nombreuses façons d'obtenir une application programmée planifiée et que chaque façon a ses propres méthodes de test.

Evidemment, quelle que soit la solution que vous utilisez et que d'autres ont mentionné, vous pouvez simplement ajuster l'heure. Changez-le à 1 minute pour confirmer que votre script effectue correctement les fonctions spécifiées.

Une fois que vous êtes convaincu que votre script fonctionne correctement que vous ne pouvez effectuer un test final pendant plus longtemps. Assurez-vous également que vous utilisez une sorte de fichier journal. Cela rendra beaucoup la vie plus facile sur la piste lorsque vous essayez de repérer des erreurs.

Selon la solution que vous utilisez, vous pouvez également vous moquer de tester la base de données, car d'autres personnes ont également mentionné, mais cela dépend de la manière dont vous obtenez votre objectif.

espoir que cela aide


0 commentaires

1
votes

Ce que nous faisons ici, c'est que nous itons sur toutes les tables, sur toutes les colonnes, et si c'est l'une des colonnes de date / heure, soustrayez le temps requis de celui-ci:

    // $con is PDO connection
    // $interval can be eg. "5 DAY"
    $tables = $con->query('show tables');
    foreach($tables->fetchAll(PDO::FETCH_COLUMN) as $table) {
            $columns = $con->query(sprintf("show columns from %s where Type in ('date', 'datetime')", $table));
            $fields = array();
            foreach($columns->fetchAll(PDO::FETCH_ASSOC) as $field) {
                    $field = $field['Field'];
                    $fields[] = sprintf('%s = DATE_SUB(%s, INTERVAL %s)', $field, $field, $interval);
            }
            if ($fields) {
                    $q = sprintf('UPDATE %s SET %s', $table, implode(', ', $fields));
                    $con->query($q);
            }
    }


1 commentaires

Idée intéressante - facture