我正在继续开发序列化层生成器。用户输入类型的描述(目前在 XSD 或 WSDL 中),软件以某种目标语言(目前是 Java 和 ansi C89)生成代码,该语言能够表示所描述的类型并且还能够序列化(变成一个字节序列)并反序列化这些值。
由于生成代码很棘手(我的意思是,编写代码很困难。编写编写代码的代码就是编写代码来做一件困难的事情,这是一个全新的硬度领域:))。因此,在我的硕士论文之前的项目中,我们决定要进行一些系统测试。
这些系统测试知道一种类型和多对值和字节序列。为了以某种语言执行系统测试,该类型在系统中运行,产生如上所述的代码。然后,该代码与一些手写的主机代码链接,该代码能够读取这些字节序列和值对,并使用函数从字符串中读取给定值的值。然后运行生成的可执行文件,并将字节值对馈送到此可执行文件中,并全面检查所有此类绑定是否导致输出“Y”。如果是这种情况,那么这些类型的示例值将序列化为先前定义的字节序列,我们可以得出结论,生成的代码可以正确编译和运行,因此,总体而言,处理这种类型的系统部分是正确的。
但是,现在我对当前的实现有点不满意。目前,我已经编写了一个自定义的 junit 运行器,它使用了大量的反射魔法来从类属性中读取这些字节值绑定。此外,生成代码的整个堆栈需要大量样板代码和样板类,它们只包含两个或三个字符串。更糟糕的是,很难与所有基于 Junits 描述并生成测试失败报告的工具进行良好的集成。如果有用的 maven Junit 测试运行程序或 eclipse 测试运行程序吞噬了编译器抛出的任何错误,那么实际上很难调试正在发生的事情,只是因为这个错误的格式与 junit 自己的断言错误不同。
更糟糕的是,生成代码中的单个失败测试会导致 maven 构建失败。这很烦人。如果不同单元的某个测试失败,如果 maven 构建失败,我喜欢它,因为(例如),如果某个深度优先预购计算由于某种原因失败,一切都会变得混乱。但是,如果我只是想向某人展示一些我知道可以工作的类型的生成代码,那么如果我不能快速构建我的应用程序,因为我现在正在处理的类型还没有完成,那就太烦人了。
那么,在这种背景下,我怎样才能得到一个很好的自动化系统来检查这些生成规范呢?我考虑过的可能性:
- 一个 Junit 集成解决方案似乎不太理想,除非我可以改进 maven 和 junit 以及 junit 与我的跑步者和其他一切的集成。
- 我们之前使用了fitnesse,但总体上放弃了它,因为它带来的问题多于解决的问题。我们遇到的主要问题是集成到 maven 和 hudson。
- 使用 texttest 的解决方案。我并不完全相信,因为这主要需要一个可执行文件,将字符串放在标准输入上,将字符串放在标准输出上。添加整个“运行应用程序,与主机代码链接,然后运行生成的可执行文件”似乎有点复杂。
- 编写我自己的解决方案。这当然可以工作并做我想做的事。但是,像往常一样,这将是最耗时的任务。
所以......你有没有看到另一种可能的方法来做到这一点,同时避免自己写东西?