如何测试代码生成工具?

时间:2009-02-02 09:37:46

标签: database unit-testing 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

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

6 个答案:

答案 0 :(得分:3)

单元测试的重点是你知道比较代码结果的答案。您必须先找到一种方法来了解SQL调用。

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

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

答案 1 :(得分:2)

这似乎是一个鸡蛋情况。你不确定生成器会吐出什么,你有一个移动的目标来测试(真正的数据库)。所以你需要将松散的末端系下来。

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

更改代码生成器时,请运行测试。他们应该只在预期的地方打破。如果发现错误,请在测试数据库中复制相关功能。创建一个新测试,检查结果。它看起来是否正确?如果您可以看到错误,请在测试中修复预期的输出。之后,修复生成器,以便创建正确的结果。关闭bug并继续前进。

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

答案 2 :(得分:1)

  

正则表达式

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

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

答案 3 :(得分:1)

如果要生成代码,为什么不生成测试呢?

除此之外,我将测试/调试生成的代码的方式与测试/调试任何其他代码的方式相同,无需单元测试(即通过阅读,运行和/或让其他人审阅)。

答案 4 :(得分:0)

您无需测试所有案例。制作一组示例调用,确保尽可能多地包含函数必须处理的困难方面,然后查看生成的代码是否正确。

答案 5 :(得分:0)

我会有一套测试放入已知输入并检查生成的SQL是否符合预期。

你永远无法为每个场景编写测试,但如果你写得足以涵盖至少最常规的模式,你可以相当自信你的发电机正在按预期工作。

如果您发现它在特定方案中不起作用,请为该方案编写另一个测试并进行修复。