实现我自己的更高级别测试脚本语言



我继承了一堆测试脚本,看起来像这样:

在标准端口 (FD) 上建立连接OT 11 02 00 0F FD等待 ACK在 12 ackValue等待连接确认在 13 ackvalue 09 88发送 5 字节的任意数据OT 21 ackValue 05 01 02 03 04 05

等等。

我想编写我自己的 simpiler 测试脚本,这些脚本高于上面的一层,可以解析以自动生成上面的脚本,这样我的脚本看起来像这样:

MAKE_STANDARD_CONNECTIONSEND_DATA (01,02,03,04,05)

因此,当解析MAKE_STANDARD_CONNECTION时,它将在前一个脚本中生成前六行。如果标准端口应该从0xFD更改为其他内容,这将允许我快速更新所有脚本......

我猜有可用的工具可以做到这一点,但它们是什么?我是一名程序员,所以如有必要,我可以使用 python 作为我选择的语言来编写代码。

感谢您的帮助,

巴里

对于这种简单的测试,您不需要任何特殊的解析器。只需使用Python。一个简单的解决方案可以像这样开始:

class TestGen(object):
    def __init__(self, filename):
        self._filename = filename
    def __enter__(self):
        self._file = open(self._filename, 'w')
        return self
    def __exit__(self, *args):
        self._file.close()
    def make_standard_connection(self):
        self._write('ot 11 02 00 0F FD')
        self._write('in 12 ackValue')
        self._write('in 13 ackValue 09 88')
    def send_data(self, *data):
        data_str = ' '.join(data)
        self._write('ot 21 ackValue 05 %s' % (data_str,))
    def _write(self, line):
        self._file.write('%sn' % line)

def script_one():
    with TestGen('output1.txt') as g:
        g.make_standard_connection()
        g.send_data('01', '02', '03', '04', '05')

运行script_one()将生成包含以下内容的文件:

ot 11 02 00 0F FD
in 12 ackValue
in 13 ackValue 09 88
ot 21 ackValue 05 01 02 03 04 05

我建议你把它实现为Python之上的内部DSL。来得及:

MAKE_STANDARD_CONNECTION()
SEND_DATA('01','02','03','04','05')

它是真正的Python代码,可以自动生成您的专有脚本。Python非常易读且编写起来很舒适,通过将其作为内部DSL,您可以获得Python的所有功能。例如,您可以执行以下操作:

values = [somefunc(i) for i in range(5)]
MAKE_STANDARD_CONNECTION()
SEND_DATA(*values)

somefunc是任意计算。要在外部DSL(即您自己的脚本语言)中实现这一点,您必须实现循环和更多构造。Python免费为您提供了此功能,这只是功能的一个小例子。

如果这听起来很有趣,谷歌一下"外部DSL"与"内部DSL",以了解我在说什么。这个世界上有足够多的奇怪、专有的、实现不佳的"脚本语言"。生另一个通常是个坏主意。

pyParsing和PLY是两个更流行的库,用于在Python中编写解析器,您可以创建自己的语法等。

或者,您可以通过编写生成所需输出的简单函数在纯 Python 中做到这一点:

make_standard_connection()
send_data(1,2,3,4,5)

相关内容

最新更新