首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试代码生成工具?

如何测试代码生成工具?
EN

Stack Overflow用户
提问于 2009-02-02 09:37:46
回答 6查看 290关注 0票数 9

我目前正在开发我的一个小项目,它以一种动态的方式生成SQL调用,供其他软件使用。SQL调用事先是未知的,因此我希望能够对生成SQL的对象进行单元测试。

你知道怎么做才是最好的方法吗?请记住,没有可能知道要生成的所有可能的SQL调用。

目前,我唯一的想法是使用regex从db创建被接受的SQL的测试用例,并确保SQL可以编译,但这并不能确保调用返回预期的结果。

编辑:添加更多信息:

我的项目是Boo的一个扩展,允许开发人员用一组属性来标记他的属性。此属性用于标识开发人员希望如何在DB中存储对象。例如:

代码语言:javascript
复制
# This attribute tells the Boo compiler extension that you want to
# store the object in a MySQL db. The boo compiler extension will make sure that you meet
# the requirements
[Storable(MySQL)] 
class MyObject():
    # Tells  the compiler that name is the PK
    [PrimaryKey(Size = 25)]
    [Property(Name)]
    private name as String

    [TableColumn(Size = 25)]
    [Property(Surname)]
    private surname as String

    [TableColumn()]
    [Property(Age)]
    private age as int

最好的想法是,生成的代码不需要使用反射,而是在编译时将其添加到类中。是的,编译会花费更长的时间,但根本不需要使用反射。目前,我的代码正在生成所需的方法,这些方法在编译时返回SQL,它们被添加到对象中,可以调用,但我需要测试生成的SQL是否正确:P

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-02 16:34:13

这看起来像是一个鸡蛋的情况。您不确定生成器将输出什么,并且您需要针对一个移动的目标(真实数据库)进行测试。所以你需要把零碎的事情处理好。

创建一个小型测试数据库(例如,使用HSQLDB或Derby)。这个数据库应该使用与真实数据库相同的功能,但不要复制!您将希望了解测试数据库中的每个内容的用途以及它们存在的原因,因此,请花费一些时间来提出一些合理的测试用例。对这个(静态)测试数据库使用您的代码生成器,将结果保存为测试用例中的固定字符串。从单个功能开始。不要试图像步骤1那样构建完美的测试数据库,你会做到的。

当您更改代码生成器时,运行测试。它们应该只在预期的位置中断。如果发现bug,请在测试数据库中复制相关特性。创建一个新的测试,检查结果。它看起来正确吗?如果您可以看到错误,请修复测试中的预期输出。在此之后,修复生成器,使其能够创建正确的结果。关闭bug并继续前进。

这样,你可以在沼泽中建造越来越安全的地面。做一些你知道的事情,检查它是否有效(忽略其他一切)。如果你感到满意,就继续前进。不要试图一次解决所有的问题。一步一步来。测试不会忘记,所以您可以忘记正在测试的所有内容,专注于下一个功能。这项测试将确保你的稳定基础不断增长,直到你可以在上面建立你的摩天大楼。

票数 2
EN

Stack Overflow用户

发布于 2009-02-02 09:45:36

单元测试的全部意义在于您知道要将代码结果与之进行比较的答案。您必须事先找到一种方法来了解SQL调用。

老实说,正如其他回答者所建议的那样,您最好的方法是提出一些预期的结果,并在单元测试中对这些结果进行硬编码。然后,您可以运行代码,获得结果,并与硬编码的期望值进行比较。

也许您可以记录实际生成的SQL,而不是执行它并比较结果?

票数 3
EN

Stack Overflow用户

发布于 2009-02-02 09:45:02

正则表达式

我认为SQL的语法是非正则的,但与上下文无关;子表达式是实现这一点的关键。您可能希望为SQL编写一个上下文无关的解析器来检查语法错误。

但是问问你自己:你想测试的是什么?你的正确性标准是什么?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/502684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档