【问题标题】:Understanding how Transcrypt autotests document the code了解 Transcrypt 自动测试如何记录代码
【发布时间】:2017-06-06 02:45:05
【问题描述】:

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

【问题讨论】:

    标签: python transcrypt


    【解决方案1】:

    自动测试在 CPython 和 Transcrypt 下运行。将结果加载到浏览器时会自动验证结果是否相同。这被称为“背靠背测试”,这是对checkfunction 的调用。因此,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 添加功能时,它们都可以轻松确保没有任何问题发生(回归测试)
    • 通读自动测试的源代码可以很好地了解支持哪些功能。

    当然是测试

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多