2017-06-06 20 views

回答

3

自動測試在CPython和Transcrypt下運行。將結果加載到瀏覽器時,結果會自動驗證爲相同。這就是所謂的「背靠背測試」,這是對check函數的調用。因此,將Transcrypt的正確行爲簡單地(「操作上」)定義爲CPython行爲。與大多數腳本語言一樣,Python缺乏正式的語義規範。

Transcrypt支持95%的CPython。 Transcrypt的內部是Python到JavaScript的編譯器,完全不同。這尤其適用於CPython(以__開始和結尾的那些)的所謂「魔術方法」,儘管如此。對於運算符重載,它們中的很多還受到了Transcrypt的支持。自動測試中的所有功能都支持相同的行爲,所以他們一起在Transcrypt中規定了「你可以做什麼」。

您可以自行運行自動測試,如下所示。對於Transcrypt基本測試:

  • 前往文件夾... /開發/ automated_tests /在你Transcrypt安裝transcrypt
  • 在命令提示符下鍵入:transcrypt -r -c - 天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,他們可以很容易地確保一切都沒有翻倒(迴歸測試)
  • 閱讀throught的的自動測試的源將提供一個良好的印象,它的功能都支持。

當然像

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 

不是。

庫軟件包的代碼也可以進行自動測試,並使用複雜的數學算法,例如,二維FFT這是必要的,從斷裂保持代碼等

__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') 

(使用複數,的Numscrypt部分轉化圖像的頻率數組)。所以每當有人貢獻給Transcrypt,他/她都被鼓勵包含一個自動測試。正則表達式模塊就是一個很好的例子,它帶有相當數量的自動測試。

請注意,自動測試幾乎不會幫助您學習Python。有很多教程和書籍,例如Alex Martelli,Anna Ravenscroft和Steve Holden撰寫的「Python in a Nutshell」。

上Transcrypts自動測試設備的內部運作一些更多的信息在這裏找到:

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