2010-09-08 3 views
3

Я создаю построитель запросов, который я хочу для модульного теста.
Я не знаю, как это сделать.Тестирование построителя запросов

Он (в настоящее время) состоит из двух частей: самого QueryBuilder, который обеспечивает свободный интерфейс для построения запросов. И SqlConstructor, который занимается построением фактического SQL.

Итак, как я могу проверить «правильность»? Должен ли я просто проверить наличие ключевых слов? (Например, select является первым ключевым словом в запросе типа 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 для меня не кажется вполне возможным, не говоря уже о том, что это полно.

Похожие:

+0

Должен ли я на самом деле заботиться о данных, проводимых в 'QueryBuilder'? Разве это не единственная важная вещь для выхода «SqlConstructor»? Я имею в виду, мне действительно все равно, как и как 'QueryBuilder' хранит свои данные, единственное, что меня волнует, это то, что' SqlConstructor' создает допустимую строку запроса. –

+0

@ Dennis, если вы хотите 100% -ное покрытие для тестирования, тогда да, проверьте QueryBuilder. Фактическая * достоверность * SQL - это совсем другое зверь. Как я уже сказал, вы проверяете, чтобы данный ввод выдавал определенный результат (или менял состояние). Тестирование действительного SQL - это другое дело. Это не проверяет функциональность метода, а тестирует синтаксис другого языка. – Gordon

+1

Вы абсолютно правы, чтобы проверить реальную ценность sql, вам нужен полноценный SQL-парсер, который довольно не подходит. Ссылка на тестовый пример ZF также очень полезна. –

Смежные вопросы