了解Transcrypt自动测试如何记录代码

时间:2017-06-06 02:45:05

标签: python transcrypt

自动测试是Transcrypt文档中不可或缺的一部分。然而,我正在努力了解它们如何揭示预期的行为。例如: https://github.com/QQuick/Transcrypt/blob/master/transcrypt/development/automated_tests/transcrypt/proxies/init.py

我无法确切地说出正确/预期的答案是什么。如何解释如下的测试?

autoTester.check (b.p, b.q, b.r, b.s)
b.p = 4
b.r = 5
autoTester.check (b.p, b.q, b.r, b.s)

1 个答案:

答案 0 :(得分:3)

自动测试在CPython和Transcrypt下运行。将结果加载到浏览器时,结果会自动验证为相同。这被称为"背靠背测试"这是对check函数的调用。因此Transcrypt的正确行为只是("操作")定义为CPython行为。与大多数脚本语言一样,Python缺乏正式的语义规范。

Transcrypt支持95%的CPython。 Transcrypt的内部结构是Python到JavaScript的编译器,它们完全不同。这特别适用于所谓的魔术方法" CPython(以__开头和结尾的那些),例如,对于运算符重载,其中许多也由Transcrypt支持。自动测试中的所有功能都支持相同的行为,因此他们共同制定了您可以做的事情"在Transcrypt。

您可以按照以下方式自行运行自动测试,例如:对于Transcrypt基本测试:

  • 转到Transcrypt安装中的文件夹... / development / automated_tests / transcrypt
  • 在命令提示符下键入:transcrypt -r -c -da autotest.py
  • 之后,在命令提示符下键入:transcrypt -c -da autotest.py
  • 在浏览器中打开生成的文件autotest.html

单击蓝色(或不希望红色)行以查看要比较的代码的结果。应该不足为奇:自动测试所做的一切确实证实了Transcrypt对他们的行为只是CPython行为。

自动测试结果" Hello world"故意错误:

Autotest results for "Hello world" with deliberate error

Transcrypt的基本功能自动测试结果:

Transcrypt's basic featurs autotest results

自动测试的价值是双重的:

  • 只要将某项功能添加到Transcrypt,就可以轻松确保没有任何内容丢失(回归测试)
  • 阅读自动测试源可以很好地了解支持哪些功能。

当然是像

这样的测试
autoTester.check (b.p, b.q, b.r, b.s)
b.p = 4
b.r = 5
autoTester.check (b.p, b.q, b.r, b.s)

虽然需要完全覆盖,但却非常简单。但是例如运算符重载代码如

def __matmul__ (self, other):
    result = Matrix (self.nRows, other.nCols)
    for iTargetRow in range (result.nRows):
        for iTargetCol in range (result.nCols):
            for iTerm in range (self.nCols):
                result._ [iTargetRow][iTargetCol] += self._ [iTargetRow][iTerm] * other._ [iTerm][iTargetCol]
    return result

ISN'吨

库包的代码也可以自动修改,并且使用复杂的数学算法,例如2D FFT(使用复数将图像转换为频率数组,Numscrypt的一部分)这是必要的,以保持像

这样的代码
__pragma__ ('opov')

orig2 = num.zeros ((128, 128), 'complex128')
orig2 [32 : 96, 32 : 96] = num.ones ((64, 64), 'complex128')

autoTester.check ('Original samples', num.round (orig2 + delta, 3) [64 : 68, 16 : 112] .tolist (), '<br>')

if transpiled:
    timeStartFft = getNow ()

freqs2 = fft.fft2 (orig2)
if transpiled:
    timeStopFft = getNow () 

autoTester.check ('Frequencies', num.round (freqs2 + delta, 3)  [64 : 68, 16 : 112] .tolist (), '<br>')

if transpiled:
    timeStartIfft = getNow ()
reconstr2 = fft.ifft2 (freqs2)
if transpiled:
    timeStopIfft = getNow ()    

if transpiled:
    print ('FFT2 for {} samples took {} ms'.format (orig2.size, timeStopFft - timeStartFft))
    print ('IFFT2 for {} samples took {} ms'.format (orig2.size, timeStopIfft - timeStartIfft))

autoTester.check ('Reconstructed samples', num.round (reconstr2 + delta, 3)  [64 : 68, 16 : 112] .tolist (), '<br>')

__pragma__ ('noopov')
打破了。因此,每当有人为Transcrypt做出贡献时,他/她都会被鼓励加入自动测试。一个很好的例子是正则表达式模块,它带有相当数量的自动测试。

请注意,自动测试很难帮助您学习Python。有很多教程和书籍,例如&#34; Python in a Nutshell&#34; Alex Martelli,Anna Ravenscroft和Steve Holden。

有关Transcrypts自动测试设施内部工作原理的更多信息,请点击此处:

http://www.transcrypt.org/docs/html/autotesting_transcrypt.html