如何测试代码生成工具?

man*_*del 9 database testing unit-testing code-generation

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

您是否了解如何才能做到这一点的最佳方法?请记住,没有可能的方法来了解要生成的所有可能的SQL调用.

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

编辑:添加更多信息:

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

# 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
Run Code Online (Sandbox Code Playgroud)

好主意是生成的代码不需要使用反射,但它会在编译时添加到类中.是的,编译需要更长的时间,但根本不需要使用Reflection.我目前有代码工作生成所需的方法,在编译时返回SQL,它们被添加到对象并可以被调用,但我需要测试生成的SQL是否正确:P

Aar*_*lla 2

这看起来就像是先有鸡还是先有蛋的情况。您不确定生成器会输出什么,并且您有一个要测试的移动目标(真实数据库)。所以你需要把松散的部分绑起来。

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

当您更改代码生成器时,运行测试。它们应该只在预期的地方断裂。如果发现错误,请在测试数据库中复制有问题的功能。创建一个新测试,检查结果。看起来正确吗?如果您看到错误,请修复测试中的预期输出。之后,修复生成器,以便它将创建正确的结果。关闭错误并继续。

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