自动化MySQL的Cucumber测试场景

我已经构建了一个重要的MySQL数据库,包含很多视图,触发器,函数和过程。

这是很难测试,并且不要忘记任何东西,所以,我已经为我的数据库的所有功能(插入,选择等等,请求函数和程序等)和视图编写了Cucumber场景。

当我们测试所有这些行为时,这对我们有很大的帮助,甚至在编写视图和其他代码之前,对确定我们真正想要做的事情非常有帮助。

我的问题是:在编写Cucumber特性后,我们都在MySQL Shell中手动测试。

我是BDD / TDD和敏捷方法的新手,但是我已经做了一些搜索以了解如何进行一些自动化,但是对于我的案例没有发现任何有趣的内容。

有没有人可以提供一些有趣的方式来为此创建自动化?

我不知道Ruby,但举例来说,是否可以直接使用RSPec和MySQL(有一些例子)?

或者用另一种语言,或者你能想到的任何解决方案!

提前致谢!

[编辑]


如果用RSpec和MySQL发现一些有趣的事情:

Mysql支持黄瓜Nagios

mysql_steps.rb


我的问题是:我对Ruby,RSPec等没有任何知识。

我正在使用优秀的“Pick Ax”书和PragProg的RSPec书进行研究

不过,我将非常感谢以下代码给出的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)

在此先感谢您的帮助 !


下面是一些您可以使用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工具,旨在让非技术性的利益相关者参与讨论,以便与他们讨论系统应该做什么。 它还可以让您轻松地重复使用步骤 - 类似的环境,事件和结果。

如果您正在编写数据库,我认为您的用户和该数据库的受众可能是技术性的。 重复使用步骤的机会也可能有限,所以Cucumber可能不是最好的工具。 您可能需要改用RSpec之类的东西。 英语工具引入了一个抽象层,另一个维护方面可能是颈部疼痛,所以我会选择一个适合您正在做的工具,而不是从该工具开始,并尝试适合您的需要围绕它。

一旦你这样做了,你可以使用ActiveRecord从你的查询中创建域对象的结果,或者你可以直接调用SQL。 RSpec只是Ruby的一些匹配器。 这个论坛可能会帮助你。

你可以做的其他事情是敲一个实际使用你的数据库的小应用程序。 这不仅确保您的数据库真正有价值, 它将为用户提供如何使用它的例子。 这对Rails来说不会很困难。 如果你遵循这条路线,那么如果你愿意的话,你可以使用类似Webrat或Watir的Cucumber,因为你将记录其他应用程序可以在更高级别使用数据库的类型。 只要确保

  • 您提供的任何现场示例都将测试数据而不是生产,并且

  • 如果你的小示例应用程序突然变成真正的应用程序(有时会发生这种情况),你可以发现这种情况并采取适当的政治和财务措施。

  • Java对MySQL也有相当多的支持,你可以使用Hibernate而不是ActiveRecord,但是我认为Ruby中的维护成本要少得多。

    链接地址: http://www.djcxy.com/p/51181.html

    上一篇: automating Cucumber test scenarios for MySQL

    下一篇: How to check if a process is running via a batch script