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