自动测试在 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 添加功能时,它们都可以轻松确保没有任何问题发生(回归测试)
- 通读自动测试的源代码可以很好地了解支持哪些功能。
当然像这样的测试
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