我目前正在开发我的一个小项目,它以一种动态的方式生成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最好的想法是,生成的代码不需要使用反射,而是在编译时将其添加到类中。是的,编译会花费更长的时间,但根本不需要使用反射。目前,我的代码正在生成所需的方法,这些方法在编译时返回SQL,它们被添加到对象中,可以调用,但我需要测试生成的SQL是否正确:P
发布于 2009-02-02 16:34:13
这看起来像是一个鸡蛋的情况。您不确定生成器将输出什么,并且您需要针对一个移动的目标(真实数据库)进行测试。所以你需要把零碎的事情处理好。
创建一个小型测试数据库(例如,使用HSQLDB或Derby)。这个数据库应该使用与真实数据库相同的功能,但不要复制!您将希望了解测试数据库中的每个内容的用途以及它们存在的原因,因此,请花费一些时间来提出一些合理的测试用例。对这个(静态)测试数据库使用您的代码生成器,将结果保存为测试用例中的固定字符串。从单个功能开始。不要试图像步骤1那样构建完美的测试数据库,你会做到的。
当您更改代码生成器时,运行测试。它们应该只在预期的位置中断。如果发现bug,请在测试数据库中复制相关特性。创建一个新的测试,检查结果。它看起来正确吗?如果您可以看到错误,请修复测试中的预期输出。在此之后,修复生成器,使其能够创建正确的结果。关闭bug并继续前进。
这样,你可以在沼泽中建造越来越安全的地面。做一些你知道的事情,检查它是否有效(忽略其他一切)。如果你感到满意,就继续前进。不要试图一次解决所有的问题。一步一步来。测试不会忘记,所以您可以忘记正在测试的所有内容,专注于下一个功能。这项测试将确保你的稳定基础不断增长,直到你可以在上面建立你的摩天大楼。
发布于 2009-02-02 09:45:36
单元测试的全部意义在于您知道要将代码结果与之进行比较的答案。您必须事先找到一种方法来了解SQL调用。
老实说,正如其他回答者所建议的那样,您最好的方法是提出一些预期的结果,并在单元测试中对这些结果进行硬编码。然后,您可以运行代码,获得结果,并与硬编码的期望值进行比较。
也许您可以记录实际生成的SQL,而不是执行它并比较结果?
发布于 2009-02-02 09:45:02
正则表达式
我认为SQL的语法是非正则的,但与上下文无关;子表达式是实现这一点的关键。您可能希望为SQL编写一个上下文无关的解析器来检查语法错误。
但是问问你自己:你想测试的是什么?你的正确性标准是什么?
https://stackoverflow.com/questions/502684
复制相似问题