автоматизация сценариев тестирования Cucumber для MySQL
Я построил важную базу данных MySQL с большим количеством представлений, триггеров, функций и процедур.
Это очень трудно проверить и ничего не забыть, поэтому я написал сценарии огурца для всех функций моей БД (Insert, Select и т. д. запрос на функции, процедуры и т. д. и представлений)
Это очень помогает нам, когда мы тестируем поведение всего этого, и даже до написания представления и другого кода очень полезно определить, хотим ли мы действительно делать.
моя проблема: после написания функций огурца мы все тестируем вручную в оболочке MySQL.
Я новичок в BDD/TDD и гибких методах, но я сделал некоторый поиск, чтобы знать, как сделать некоторую автоматизацию, но не нашел ничего интересного для моего случая.
есть ли кто-нибудь, кто может предоставить какой-то интересный способ создания автоматизации для этого?
Я не знаю Ruby, но, например, можно ли использовать RSPec непосредственно с MySQL (с некоторыми примеры)?
или на другом языке, или любое решение, вы можете думать!
спасибо заранее!
[EDIT]
Если найдено несколько интересных вещей с RSpec и MySQL:
Поддержка Mysql Для Огурца Nagios
моя проблема: у меня нет knoledge с Ruby, RSPec и т. д.
Я работаю над этим с отличная книга" Pick Axe " и книга RSPec от PragProg
но я буду очень благодарен за небольшой пример шагов RSpec, приведенных ниже:
Процедура MySQL
DELIMITER $$
CREATE PROCEDURE `prc_liste_motif` (
IN texte TEXT,
IN motif VARCHAR(255),
OUT nb_motif INT(9),
OUT positions TEXT)
BEGIN
DECLARE ER_SYNTAXE CONDITION FOR SQLSTATE '45000';
DECLARE sousChaine TEXT;
DECLARE positionActuelle INT(9) DEFAULT 1;
DECLARE i INT(9) DEFAULT 1;
IF
LENGTH(motif) > LENGTH(texte)
THEN
SIGNAL ER_SYNTAXE
SET MESSAGE_TEXT =
'Bad Request: Le motif est plus long que le texte.',
MYSQL_ERRNO = 400;
END IF;
SET positions = '';
SET nb_motif = 0;
REPEAT
SET sousChaine = SUBSTRING_INDEX(texte, motif, i);
SET positionActuelle = LENGTH(sousChaine) + 1;
IF
positionActuelle < LENGTH(texte) + 1
THEN
IF
LENGTH(positions) > 0
THEN
SET positions = CONCAT(positions, ',');
END IF;
SET positions = CONCAT(positions, positionActuelle);
SET nb_motif = nb_motif + 1;
END IF;
SET i = i + 1;
UNTIL LENGTH(sousChaine) >= LENGTH(texte)
END REPEAT;
END$$
функция огурец:
Feature: Procedure prc_liste_motif
In order to precess a string according to a given unit
I want to know the number of units present in the chain and their positions
Knowing that the index starts at 1
Background: the database mydatabase in our SGBDR server
Given I have a MySQL server on 192.168.0.200
And I use the username root
And I use the password xfe356
And I use the database mydatabase
Scenario Outline: Using the procedure with good values in parameters
Given I have a procedure prc_liste_motif
And I have entered <texte> for the first parameter
And I have entered <motif> for the second parameter
And I have entered <nb_motif> for the third parameter
And I have entered <positions> for the fourth parameter
When I call prc_liste_motif
Then I should have <out_nb_motif> instead of <nb_motif>
Then I should have <out_positions> instead of <positions>
Exemples:
| texte | motif | nb_motif | positions | out_nb_motif | out_positions |
| Le beau chien | e | | | 3 | 2,5,12 |
| Allo | ll | | | 1 | 2 |
| Allo | w | | | 0 | |
исключение пройденного теста вручную в MySQL:
$ mysql -h 192.168.0.200 -u root -p xfe356
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.5.9 MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql> USE mydatabase
Database changed
mysql> SET @texte = 'Le beau chien';
Query OK, 0 rows affected (0.00 sec)
mysql> SET @motif = 'e';
Query OK, 0 rows affected (0.00 sec)
mysql> SET @nb_motif = NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> SET @positions = NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> SET @out_nb_motif = 3;
Query OK, 0 rows affected (0.00 sec)
mysql> SET @out_positions = '2,5,12';
Query OK, 0 rows affected (0.00 sec)
mysql> CALL prc_liste_motif(@texte, @motif, @nb_motif, @positions);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @nb_motif = @out_nb_motif AND @positions = @out_positions;
+-----------------------------------------------------------+
| @nb_motif = @out_nb_motif AND @positions = @out_positions |
+-----------------------------------------------------------+
| 1 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
заранее спасибо за вашу помощь !
2 ответов
вот некоторый псевдокод для одного из способов проверки вашей базы данных с помощью RSpec:
describe "prc_liste_motif" do
before(:all) do
# Set up database connection here
end
describe "good values" do
context "Le beau chien" do
let(:texte) { "Le beau chien" }
# Set up other variables here
let(:results) { # call prc_liste_motif here }
it "has the correct out_nb_motif" do
out_nb_motif = # however you derive this from the results of the procedure
out_nb_motif.should == 3
end
it "has the correct out_positions" do
# test out_positions here
end
end
end
end
одна вещь, которую я заметил в вашем образце ручного теста была, как вы проверяете результаты:
SELECT @nb_motif = @out_nb_motif AND @positions = @out_positions;
Это покажет вам, являются ли эти два значения правильными, но если вы получаете 0 результатов для этого запроса, вы не сразу знаете, какое из двух значений неверно, и вы не знаете, какое значение вы получаете вместо этого; получение этой информации требует больше расследование.
разделив проверку этих двух значений на 2 теста RSpec, после завершения тестов вы можете узнать, правильны ли оба, если один неверен, или если оба неверны. Если один или оба неверны, RSpec также вернет сообщение для неудачного теста, в котором говорится: "ожидаемый 3, получил 4", что может помочь вам отлаживать быстрее.
когда вы добавляете больше тестов для разных входов, я рекомендую рефакторинг псевдокода, который я дал здесь для использования shared_examples_for. Книга PragProg RSpec, которую вы уже читаете, - отличная ссылка.
Cucumber-это инструмент BDD на естественном языке, который предназначен для привлечения нетехнических заинтересованных сторон на борт, чтобы вы могли поговорить с ними о том, что должна делать система. Он также позволяет легко использовать шаги-аналогичные контексты, события и результаты.
Если вы пишете базу данных, я думаю, что ваши пользователи и аудитория для этой базы данных будут техническими. Также могут быть ограничены возможности для повторного использования шагов, поэтому огурец не может быть лучшие средства. Вы, вероятно, правы о переходе к чему-то вроде RSpec вместо этого. Англоязычные инструменты вводят слой абстракции и другой аспект обслуживания, который может быть болью в шее, поэтому я бы выбрал инструмент, который подходит для того, что вы делаете, а не начинать с инструмента и пытаться соответствовать вашим потребностям вокруг него.
Как только вы это сделаете, вы можете использовать ActiveRecord для создания результатов domain-object из ваших запросов, или вы можете просто вызвать SQL напрямую. Для RSpec это просто Руби с некоторыми matchers. этот форум может помочь вам.
Что-то еще вы можете сделать, это запустить небольшое приложение, которое фактически использует вашу базу данных. Это не только гарантирует, что ваша база данных действительно ценна; она предоставит пользователям примеры ее использования. Это будет не очень сложно сделать с Rails. Если вы идете по этому маршруту, то вы can используйте огурец с чем-то вроде Webrat или Watir, если хотите, потому что вы документируйте то, для чего другие приложения могут использовать вашу базу данных на более высоком уровне. Просто убедитесь, что
любые живые примеры, которые вы предоставляете перейти к данные испытаний вместо производства, и это
Если ваш маленький пример приложения внезапно превращается в реальное приложение (что иногда случается), вы в состоянии определить, что происходит и принимать соответствующие политические и финансовые меры.
Java также имеет довольно много поддержки MySQL, и вы можете использовать Hibernate вместо ActiveRecord, но я думаю, что расходы на обслуживание будут много меньше в Ruby.