2

自动测试是 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)
4

1 回答 1

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”的自动测试结果:

自动测试结果

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

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

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

  • 每当向 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

不是。

库包的代码也可以自动测试,并使用复杂的数学算法,例如 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。有很多关于这方面的教程和书籍,例如 Alex Martelli、Anna Ravenscroft 和 Steve Holden 的“Python in a Nutshell”。

有关 Transcrypts 自动测试工具内部工作原理的更多信息,请参见此处:

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

于 2017-06-06T06:37:11.403 回答