автоматизация тестовых сценариев Cucumber для MySQL - PullRequest
8 голосов
/ 05 марта 2011

Я создал важную базу данных MySQL, с множеством представлений, триггеров, функций и процедур.

Очень сложно протестировать и ничего не забыть, поэтому я написал сценарии Cucumberдля всех функций моей БД (Вставка, Выбор и т. д., запрос функций, процедур и т. д., а также представлений)

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

Моя проблема: после написания функций Cucumber мы все тестируем вручную в MySQL Shell.

IЯ новичок в методах BDD / TDD и Agile, но я провел некоторый поиск, чтобы узнать, как сделать некоторую автоматизацию, но не нашел ничего очень интересного для моего случая.

Есть ли кто-нибудь, кто может предоставить какой-то интересный способсоздать автоматизацию для этого?

Я не знаю Ruby, но на примере можно ли использовать RSPec напрямую с MySQL (с некоторыми примерами)?

Или на другом языке, илиy решение, которое вы можете придумать!

Заранее спасибо!

[EDIT]


Если найдены некоторые интересные вещи с RSpec и MySQL:

Поддержка Mysql для огурца Nagios

mysql_steps.rb


Моя проблема: я неУ меня есть опыт работы с 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 ]

3 голосов
/ 20 марта 2011

Вот несколько псевдокодов для одного способа тестирования вашей базы данных с помощью 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, которую вы уже читаете, является отличным справочником.

1 голос
/ 06 марта 2011

Cucumber - это инструмент BDD на естественном языке, предназначенный для привлечения нетехнических заинтересованных сторон, чтобы вы могли поговорить с ними о том, что должна делать система.Он также позволяет довольно легко повторно использовать шаги - аналогичные контексты, события и результаты.

Если вы пишете базу данных, я думаю, что ваши пользователи и аудитория этой базы данных будут техническими.Возможности повторного использования шагов также могут быть ограничены, поэтому огурец может быть не лучшим инструментом.Вы, вероятно, правы о переходе на что-то вроде RSpec вместо этого.Англоязычные инструменты вводят слой абстракции и еще один аспект обслуживания, который может быть болью в шее, поэтому я бы выбрал инструмент, который подходит вам, вместо того, чтобы начинать с инструмента и пытаться соответствовать вашему.вокруг этого.

Как только вы это сделаете, вы можете использовать ActiveRecord для создания результатов доменного объекта из ваших запросов или просто вызвать SQL напрямую.RSpec - это просто Ruby с некоторыми совпадениями. Этот форум может вам помочь.

Что еще вы можете сделать, это запустить небольшое приложение, которое фактически использует вашу базу данных.Это не только обеспечит подлинную ценность вашей базы данных;он предоставит пользователям примеры того, как его использовать.Это не будет очень сложно сделать с Rails.Если вы пойдете по этому пути, то вы сможете использовать Cucumber с чем-то вроде Webrat или Watir, если хотите, потому что вы будете документировать то, для чего другие приложения могут использовать вашу базу данных на более высоком уровне.уровень.Просто убедитесь, что

  1. все живые примеры, которые вы предоставляете, идут для тестирования данных вместо производства, и что

  2. , если ваше маленькое приложение-пример внезапно превращаетсяв реальное приложение (что иногда случается), вы в состоянии заметить это и предпринять соответствующие политические и финансовые шаги.

Java также имеет большую поддержку MySQLи вы могли бы использовать Hibernate вместо ActiveRecord, но я думаю, что затраты на обслуживание в Ruby будут намного меньше.

...