2010-09-08 96 views
3

我在构建一个查询生成器,我想单元测试。
虽然我不知道该怎么做。测试查询生成器

它(目前)由两部分组成:QueryBuilder本身为构建查询提供了流畅的界面。和一个SqlConstructor负责构建实际的SQL。

所以基本上,我该如何测试'正确性'?我应该只测试关键字的存在吗? (比如,select是选择类型查询中的第一个关键字?)我认为要正确测试,有很多重要的事情,例如关键字出现的顺序等。等等。

回答

1

您测试对于给定的输入,有一个预期的输出。

如果我理解正确,您的QueryBuilder正在收集查询部分,所以当您通过QueryBuilder的方法添加它们时,确保包含这些部分的数据结构实际上包含它们。如果它有一个addWhereClause方法或类似的东西,检查该方法实际上是否执行,你写入方法体的内容,例如写这样

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

对于SqlConstructor测试做同样的测试,它从你充满QueryBuilder的数据结构的获取输入(你可能想嘲笑它为)产生预期的输出。

如果您想测试SQL的实际有效性,请为此编写一个单独的测试用例。请记住,UnitTest的目的不是确保SQL是正确的,而是您的SQLGenerator以您告诉它生成SQL的方式生成SQL。

验证SQL时的问题是,SQL很复杂。它有一个正式的语法。你的测试用例中包含多少文法?为SQL编写解析器听起来不太可行,更不用说完成了。

相关:

+0

我应该真正关心的'QueryBuilder'正在举行中的数据? 'SqlConstructor'的输出不是唯一重要的东西吗?我的意思是,我真的不关心QueryBuilder存储它的数据,我唯一关心的是'SqlConstructor'生成一个有效的查询字符串。 – 2010-09-08 09:23:27

+0

@丹尼斯如果你想100%的测试覆盖率,那么是的,测试QueryBuilder。 SQL的实际*有效性*虽然是一个完全不同的野兽。就像我说过的,你测试以确保给定的输入产生特定的输出(或改变状态)。测试有效的SQL是另一回事。这不是测试方法功能,而是测试不同语言的语法。 – Gordon 2010-09-08 09:30:41

+1

你是绝对正确的,为了测试sql的实际有效性,你需要一个完整的sql语法分析器,这是相当不合适的。与ZF测试用例的链接也非常有帮助。 – 2010-09-08 09:44:28