MySQL测试场景的自动化
我构建了一个重要的MySQL数据库,其中包含很多视图、触发器、函数和过程 很难进行测试,也很难忘记任何事情,因此,我已经为我的数据库的所有功能编写了黄瓜场景(插入、选择等、函数请求、过程等和视图) 当我们测试所有这些行为时,这对我们有很大帮助,甚至在编写视图和其他代码之前,确定我们真正想要做的事情也是非常有帮助的 我的问题是:在编写Cucumber特性之后,我们都在MySQL Shell中手工测试 我是BDD/TDD和敏捷方法方面的新手,但我做了一些搜索,以了解如何实现一些自动化,但没有发现对我的案例非常有趣的东西 有没有人能提供一些有趣的方法来实现自动化 我不知道Ruby,但是举个例子,可以直接将RSPec与MySQL结合使用吗(有一些例子) 或者用另一种语言,或者任何你能想到的解决方案 提前谢谢 [编辑]MySQL测试场景的自动化,mysql,tdd,rspec,cucumber,bdd,Mysql,Tdd,Rspec,Cucumber,Bdd,我构建了一个重要的MySQL数据库,其中包含很多视图、触发器、函数和过程 很难进行测试,也很难忘记任何事情,因此,我已经为我的数据库的所有功能编写了黄瓜场景(插入、选择等、函数请求、过程等和视图) 当我们测试所有这些行为时,这对我们有很大帮助,甚至在编写视图和其他代码之前,确定我们真正想要做的事情也是非常有帮助的 我的问题是:在编写Cucumber特性之后,我们都在MySQL Shell中手工测试 我是BDD/TDD和敏捷方法方面的新手,但我做了一些搜索,以了解如何实现一些自动化,但没有发现对我
如果在RSpec和MySQL中发现了一些有趣的东西:
我的问题是:我对Ruby、RSPec等没有任何知识 我正在用优秀的“鹤嘴锄”书和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$$
提前感谢您的帮助 Cucumber是一个自然语言BDD工具,旨在让非技术利益相关者参与进来,以便您可以与他们讨论系统应该做什么。它还允许您非常轻松地重用步骤——类似的上下文、事件和结果 如果您正在编写一个数据库,我认为您的用户和该数据库的受众很可能是技术性的。重用步骤的机会也可能有限,因此Cucumber可能不是最好的工具。你可能是对的,转而选择RSpec。英语语言工具引入了一个抽象层和维护的另一个方面,这可能是一个棘手的问题,因此我会选择一个适合您所做工作的工具,而不是从该工具开始,并试图满足您的需求 完成后,可以使用ActiveRecord从查询中创建域对象结果,也可以直接调用SQL。RSpec只是带有一些匹配器的Ruby。也许对你有帮助 您可以做的另一件事是创建一个实际使用您的数据库的小应用程序。这不仅可以确保您的数据库真正有价值;它将为用户提供如何使用它的示例。这对于Rails来说并不难。如果你沿着这条路线走下去,那么如果你愿意的话,你可以将Cucumber与Webrat或Watir之类的东西一起使用,因为你将在更高的层次上记录其他应用程序可以使用你的数据库的事情。确保
Java对MySQL也有相当多的支持,您可以使用Hibernate而不是ActiveRecord,但我认为在Ruby中维护成本会低得多。以下是一些伪代码,用于使用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,则您无法立即知道这两个值中的哪一个值不正确,也无法知道所获得的值是什么;获得这些信息需要更多的调查
通过将这两个值的检查分为两个RSpec测试,当测试完成运行时,您可以知道这两个值是否都正确,其中一个值是否不正确,或者这两个值是否都不正确。如果其中一个或两个都不正确,RSpec还会为失败的测试返回一条消息,上面写着“Expected 3,Get 4”,这可以帮助您更快地调试
当您为不同的输入添加更多的测试时,我建议重构我在这里给出的伪代码以使用共享的示例。您正在阅读的PragProg RSpec书是一本很好的参考书。我的数据库非常先进,我真的需要作为客户(数据库的me用户)来描述我的数据库的用例和组件,cucumber完全适合这种情况。用法语描述我想要的东西是很重要的(是的,对不起,我用法语而不是英语来描述黄瓜),但我想我已经找到了一种用RSpec的方法,类似这样的东西很棒。谢谢你的指针编辑说“自然语言”,因为我认为现在有很多公司用不同的语言使用它!祝RSpec和您的数据库好运。这样使用cucumber是件坏事吗?我发现对预期行为的非技术性描述非常有趣:在我看来,它为代码和许多其他“好东西”提供了一个非常好的文档……它带来了成本。如果利益值得付出代价,那也不是坏事。我对上下文了解不够,无法说明RSpec在您的情况下是否更好。也许在一两个场景中也可以尝试RSpec,看看吧?当我们从Cucumber开始时,我们已经发现了一个巨大的好处。如何在Cucumber和MySQL之间实现自动化以获得更大的好处还有待了解^^
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;