在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ exercise47.自動化測試
附錄 A-練習 9:生成一個空文件(Touch, New-Item)
附錄 A-練習 10:復制文件 (cp)
exercise44.繼承 Vs.包含
附錄 A-練習 14:刪除文件 (rm)
附錄 A-練習 11:移動文件 (mv)
exercise46.項目骨架
附錄 A-練習 3:如果你迷路了
exercise37.復習符號
exercise47.自動化測試
exercise3.數(shù)字和數(shù)學計算
附錄 A-練習 1:安裝
exercise32.循環(huán)和列表
exercise31.做出決定
exercise42.對象、類、以及從屬關(guān)系
exercise48.更復雜的用戶輸入
下一步
簡介
附錄 A-練習 7:刪除路徑 (rmdir)
exercise49.寫代碼語句
exercise18.命名, 變量, 代碼, 函數(shù)
exercise12.提示別人
exercise14.提示和傳遞
exercise40.模塊, 類和對象
附錄 A-練習 12:查看文件 (less, MORE)
exercise9.打印, 打印, 打印
exercise13.參數(shù), 解包, 變量
exercise30. Else 和 If
exercise28. 布爾表達式
附錄 A-練習 4:創(chuàng)建一個路徑 (mkdir)
附錄 A-練習 15:退出命令行 (exit)
exercise25. 更多更多的練習
exercise6.字符串和文本
exercise2.注釋和井號“#”
exercise21. 函數(shù)的返回值
附錄 A-下一步
exercise1.第一個程序
exercise23. 閱讀代碼
附錄 A-練習 5:改變當前路徑 (cd)
exercise17.更多文件操作
exercise24. 更多的練習
exercise19.函數(shù)和變量
exercise51.從瀏覽器獲取輸入
exercise22. 到目前為止你學到了什么?
exercise41.學會說面向?qū)ο?/span>
exercise52.開始你的 web 游戲
exercise20. 函數(shù)和文件
exercise15.讀文件
exercise45.你來制作一個游戲
exercise10.那是什么?
exercise8.打印, 打印
exercise35.分支和函數(shù)
exercise26. 恭喜你,可以進行一次考試了
exercise33.while 循環(huán)
exercise29. IF 語句
exercise36.設(shè)計和調(diào)試
exercise0.安裝和準備
exercise50.你的第一個網(wǎng)站
附錄 A-練習 2:路徑, 文件夾, 名錄 (pwd)
exercise38.列表操作
附錄 A-練習 6:列出當前路徑 (ls)
exercise16.讀寫文件
exercise4.變量和命名
exercise34.訪問列表元素
exercise11.提問
exercise43.基本的面向?qū)ο蟮姆治龊驮O(shè)計
附錄 A-簡介
附錄 A-練習 8:目錄切換(pushd, popd)
來自老程序員的建議
exercise27. 記住邏輯
exercise5.更多的變量和打印
exercise7.更多的打?。ㄝ敵觯?/span>
附錄 A-練習 13:輸出文件 (cat)
exercise39.字典,可愛的字典

exercise47.自動化測試

你需要一遍一遍地在你的游戲中輸入命令,來測試游戲的功能是否正常。這個過程是很枯燥無味的。如果能寫一小段代碼用來測試你的代碼豈不是更好?然后無論你對程序做了什么修改,或者添加了什么新東西,你只要“跑一下你的測試”,而這些測試能確認程序依然能正確運行。這些自動測試不會抓到所有的 bug,但可以讓你無需重復輸入命令運行你的代碼,從而為你節(jié)約很多時間。

從這節(jié)練習開始,以后的練習將不會有“你應該看到的結(jié)果”部分,取而代之的是一個“你應該測試的東西”。從現(xiàn)在開始,你需要為自己寫的所有代碼寫自動化測試,而這將讓你成為一個更好的程序員。

我不會解釋你為什么需要寫自動化測試。我要告訴你的是,你想要成為一個程序員,而程序的作用是讓無聊冗繁的工作自動化,測試一個軟件毫無疑問是無聊冗繁的,所以你還是寫點代碼讓它為你測試的更好。

這應該是你需要的所有的解釋了。因為你寫單元測試的原因是讓你的大腦更加強健。讀了這本書,你寫了很多代碼讓它們實現(xiàn)一些事情?,F(xiàn)在你將更進一步,寫出懂得你寫的其他代碼的代碼。這個寫代碼測試你寫的其他代碼的過程將強迫你清楚的理解你之前寫的代碼。這會讓你更清晰地了解你寫的代碼實現(xiàn)的功能及其原理,而且讓你對細節(jié)的注意更上一個臺階。

編寫測試用例

我們將拿一段非常簡單的代碼為例,寫一個簡單的測試,這個測試將建立在上節(jié)我們創(chuàng)建的項目骨架上面。

首先從你的項目骨架創(chuàng)建一個叫做 ex47 的項目。下面是你要采取的步驟。我會給出文字說明,而不是直接告訴你該如何寫代碼,所以你要自己弄明白并寫出代碼。

1.復制 skeleton 到 ex47 2.將所有的 NAME 重命名為 ex47 3.修改所有文件中 NAME 為 ex47 4.最后刪除所有的*.pyc 文件

如果遇到什么困難,回顧一下練習 46,如果你不能簡單的完成這些,那你需要多練習幾次。

NOTE: 記得通過命令 nosetests 來檢測你的測試代碼沒有錯誤信息。你可以通過 python ex47_tests.py 來運行,但是它不會那么容易的運行,你必須保證你的每一個測試文件正常運行。

接下來創(chuàng)建一個簡單的 ex47/game.py 文件,里邊放一些用來被測試的代碼。我們現(xiàn)在放一個傻乎乎的小 class 進去,用來作為我們的測試對象:

class Room(object):

    def __init__(self, name, description):
        self.name = name
        self.description = description
        self.paths = {}

    def go(self, direction):
        return self.paths.get(direction, None)

    def add_paths(self, paths):
        self.paths.update(paths)

準備好了這個文件,接下來把測試骨架改成這樣子:

from nose.tools import *
from ex47.game import Room

def test_room():
    gold = Room("GoldRoom", 
                """This room has gold in it you can grab. There's a
                door to the north.""")
    assert_equal(gold.name, "GoldRoom")
    assert_equal(gold.paths, {})

def test_room_paths():
    center = Room("Center", "Test room in the center.")
    north = Room("North", "Test room in the north.")
    south = Room("South", "Test room in the south.")

    center.add_paths({'north': north, 'south': south})
    assert_equal(center.go('north'), north)
    assert_equal(center.go('south'), south)

def test_map():
    start = Room("Start", "You can go west and down a hole.")
    west = Room("Trees", "There are trees here, you can go east.")
    down = Room("Dungeon", "It's dark down here, you can go up.")

    start.add_paths({'west': west, 'down': down})
    west.add_paths({'east': start})
    down.add_paths({'up': start})

    assert_equal(start.go('west'), west)
    assert_equal(start.go('west').go('east'), start)
    assert_equal(start.go('down').go('up'), start)

這個文件導入了你在 ex47.game 創(chuàng)建的 Room 這個類,接下來我們要做的就是測試它。于是我們看到一系列的以 test_開頭的測試函數(shù),它們就是所謂的“測試用例(test case)”,每一個測試用例里面都有一小段代碼,它們會創(chuàng)建一個或者一些房間,然后去確認房間的功能和你期望的是否一樣。它測試了基本的房間功能,然后測試了路徑,最后測試了整個地圖。

這里最重要的函數(shù)是 assert_equal,它保證了你設(shè)置的變量,以及你在 Room 里設(shè)置的路徑和你的期望相符。如果你得到錯誤的結(jié)果的話,nosetests 將會打印出一個錯誤信息,這樣你就可以找到出錯的地方并且修正過來。

測試指南

在寫測試代碼時,你可以照著下面這些不是很嚴格的指南來做:

1.測試腳本要放到 tests/目錄下,并且命名為 BLAH_tests.py,否則 nosetests 就不會執(zhí)行你的測試腳本了。這樣做還有一個好處就是防止測試代碼和別的代碼互相混掉。 2.為你的每一個模組寫一個測試。 3.測試用例(函數(shù))保持簡短,但如果看上去不怎么整潔也沒關(guān)系,測試用例一般都有點亂。 4.就算測試用例有些亂,也要試著讓他們保持整潔,把里邊重復的代碼刪掉。創(chuàng)建一些輔助函數(shù)來避免重復的代碼。當你下次在改完代碼需要改測試的時候,你會感謝我這一條建議的。重復的代碼會讓修改測試變得很難操作。 5.最后一條是別太把測試當做一回事。有時候,更好的方法是把代碼和測試全部刪掉,然后重新設(shè)計代碼。

你看到的結(jié)果

$ nosetests
...
----------------------------------------------------------------------
Ran 3 tests in 0.008s

OK

如果一切工作正常的話,你看到的結(jié)果應該就是這樣。試著把代碼改錯幾個地方,然后看錯誤信息會是什么,再把代碼改正確。

附加題

1.仔細讀讀 nosetest 相關(guān)的文檔,再去了解一下其他的替代方案。 2.了解一下 Python 的 “doc tests” ,看看你是不是更喜歡這種測試方式。 3.改進你游戲里的 Room,然后用它重建你的游戲,這次重寫,你需要一邊寫代碼,一邊把單元測試寫出來。

常見問題

Q: 當我運行 nosetest 的時候,我遇到一個語法錯誤

如果你遇到這個報錯,看看錯誤信息是怎么說的,并改正該行或上一行的錯誤。類似 nosetest 的工具是在運行你的代碼和測試代碼,所以他可以像運行 python 一樣發(fā)現(xiàn)你的語法錯誤。

Q: 我無法導入 ex47.game

確認你創(chuàng)建了 ex47/init.py 文件,參照練習 46,看它是如何做的。如果這個文件沒有問題,在 OSX/Linux 下執(zhí)行:export PYTHONPATH=.在 window 下執(zhí)行$env:PYTHONPATH = "$env:PYTHONPATH;.",最后,確認你是用 nosetest 運行測試腳本,而不是用 python。

Q: 我運行 nosetest 的時候,遇到一個報錯 UserWarning

你可能安裝了兩個版本的 python 或者沒有使用 distribute,按照我在練習 46 中所描述的安裝 distribute 或 pip。