2010-09-08 21 views
3

Je suis en train de créer un générateur de requêtes que je veux tester.
Je ne sais pas comment y arriver.Test d'un générateur de requête

Il (actuellement) se compose de deux parties: le QueryBuilder lui-même qui fournit une interface fluide pour la construction de requêtes. Et un SqlConstructor qui prend en charge la construction du SQL réel.

Donc, fondamentalement, comment puis-je tester la «correction»? Devrais-je juste tester l'existence de mots-clés? (Comme, select étant le premier mot-clé dans une requête select-type?) Je pense que pour tester correctement, il y a beaucoup de choses qui sont importantes, comme l'ordre dans lequel les mots-clés apparaissent etc

Répondre

1

Vous testez que pour une entrée donnée, il y a une sortie attendue. Si je comprends bien, votre QueryBuilder collecte des parties de requête, assurez-vous donc que la structure de données contenant ces parties les contient réellement lorsque vous les ajoutez via la méthode de QueryBuilder. Si elle a une méthode addWhereClause ou quelque chose comme ça, vérifiez que la méthode fait effectivement, ce que vous avez écrit dans le corps de la méthode, par exemple. écrire un test comme

public function testWhereMethodAddsExpressionToPartsArray() 
{ 
    $expression = 'foo = "bar"'; 
    $this->sut->where($expression); 
    $parts = $this->sut->getParts('where'); 
    $this->assertContains($expression, $parts); 
} 

Pour la SqlConstructor faire la même chose, le test que les informations qu'elle reçoit de la structure de données que vous avez rempli avec le QueryBuilder (vous voudrez peut-être pour se moquer de cela) produit le résultat attendu.

Si vous souhaitez tester la validité réelle du code SQL, créez un test de test distinct pour cela. Gardez à l'esprit que ce n'est pas le but d'un test UnitTest de s'assurer que le SQL est correct, mais que votre SQLGenerator génère le SQL de la manière dont vous lui avez demandé de le générer.

Le problème lors de la validation du SQL est que SQL est complexe. Il a une grammaire formelle. Quelle part de cette grammaire couvrirait vos cas de test? L'écriture d'un analyseur pour SQL ne me semble pas trop faisable, encore moins celle qui est complète.

connexes:

+0

Dois-je me préoccupe vraiment les données détenues dans le 'QueryBuilder'? La seule chose importante est la sortie de 'SqlConstructor'? Je veux dire, je ne m'inquiète pas vraiment si ou comment 'QueryBuilder' stocke ses données, la seule chose qui m'importe c'est que' SqlConstructor' produit une chaîne de requête valide. –

+0

@Dennis si vous voulez une couverture de test de 100%, alors oui, testez le QueryBuilder. La * validité * réelle du SQL est une bête entièrement différente. Comme je l'ai dit, vous testez pour vous assurer qu'une entrée donnée produit une sortie spécifique (ou change un état). Tester un SQL valide est une chose différente. Cela ne teste pas la fonctionnalité de la méthode, mais la syntaxe de test d'une langue différente. – Gordon

+1

Vous avez absolument raison, pour tester la validité réelle du sql, vous auriez besoin d'un analyseur sql à part entière, ce qui est assez hors de portée. Le lien vers le cas de test ZF est également très utile. –