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

2024-07-01 06:49:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我继承了一堆类似这样的测试脚本:

// make connection on standard port (FD)
ot 11 02 00 0F FD
// wait for ACK
in 12 ackValue
// wait for connection confirmation
in 13 ackValue 09 88
//send 5 bytes of arbitary data
ot 21 ackValue 05 01 02 03 04 05

等等。在

我想写我自己的simpiler测试脚本,它是上面的一层,可以被解析为自动生成上面的脚本,这样我的脚本看起来像这样:

^{pr2}$

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

我猜有一些工具可以实现这一点,但是它们是什么呢?我是一个程序员,所以如果有必要,我可以用python作为我选择的语言来编写这个代码。在

谢谢你的帮助

巴里


Tags: 端口in脚本formakeonportot
3条回答

pyParsing和{a2}是用Python编写解析器的两个比较流行的库,您可以创建自己的语法,等等

或者,可以通过编写生成所需输出的简单函数,在纯python中执行此操作:

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

对于这种简单的测试,您不需要任何特殊的解析器。只需使用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('%s\n' % line)


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

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

^{pr2}$

我建议您将其实现为Python之上的内部DSL。做到:

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

它是真正的Python代码,可以自动生成您的专有脚本。Python可读性很强,编写起来也很舒服,通过将其作为一个内部DSL来实现,您可以使用Python的所有功能。例如,可以执行以下操作:

^{pr2}$

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

如果这听起来很有趣的话,google对“外部DSL”和“内部DSL”进行了一点比较,以了解我在说什么。在这个世界上,有足够多奇怪、专有、实施不善的“脚本语言”。生另一个孩子通常是个坏主意。在

相关问题 更多 >

    热门问题