笨办法学python47详解_练习 47 - 自动化测试 - 笨办法学Python3
練習 47. 自動化測試
為了確認游戲功能是否正常,你需要一遍一遍地在你的游戲中輸入命令。這個過程非常枯燥。如果能寫一小段代碼來測試你的代碼豈不是更好?一旦你對程序做了任何修改,或者添加了什么新東西,你只要“跑一下你的測試”,這些測試就能確保程序依然能正常運行。這些自動測試不會捕捉到所有 bug,但是可以讓你無需重復輸入命令來運行你的代碼,從而為你節約很多時間。
從這一節開始,以后每個練習將不再有“你會看到”這一部分,取而代之的是“你應該測試”(What You Should Test)部分。從現在開始,你需要為自己寫的所有代碼寫自動化測試,這會讓你成為一個更好的程序員。
我不會試圖解釋為什么你需要寫自動化測試。我要告訴你的是,你想要成為一個程序員,而程序的作用是讓無聊冗繁的工作自動化,測試軟件毫無疑問是無聊冗繁的,所以你還是寫點代碼讓它為你來做測試工作比較好好。
這應該是你需要的所有的解釋了。因為你寫單元測試的原因是讓你的大腦更加強健。你讀了這本書,寫了很多代碼讓它們實現一些事情?,F在你將更進一步,寫出能讀懂你寫的其他代碼的代碼。這個寫代碼來測試你寫的其他代碼的過程將強迫你清楚地理解你之前寫的代碼。同時清晰地了解這些代碼實現的功能及其原理,從而讓你對細節的注意更上一個臺階。
寫一個測試用例(test case)
我們會拿一段非常簡單的代碼為例,寫一個簡單的測試,這個測試將建立在上節我們創建的項目骨架上面。
首先,從你的項目骨架創建一個叫做 ex47 的項目。以下是你要遵循的步驟,我會通過語言描述來告訴你,而不是直接給你代碼,這樣可以給你思考的機會:
把項目骨架復制到 ex47。
把所有的 NAME 文件重命名為 ex47。
把所有文件中的 NAME 單詞替換為 ex47。
最后,刪除所有 *.pyc 文件來確保你的文件夾是干凈的。
如果你卡住了,可以回去查閱練習 46,如果沒辦法完成這些步驟,那你可能需要多練習幾次。
警告!
記住,你通過運行 nosetests 命令來運行測試。你可以直接輸入 python3.6 ex47_tests.py 來運行,但是沒那么容易跑通,而且你需要為每個測試文件執行一次這個命令。
接下來,創建一個簡單的文件 ex47/game.py ,你可以把代碼放入其中進行測試。這是一個非常小的類,其代碼如下:
game.py
1 class Room(object):
2
3 def __init__(self, name, description):
4 self.name = name
5 self.description = description
6 self.paths = {}
7
8 def go(self, direction):
9 return self.paths.get(direction, None)
10
11 def add_paths(self, paths):
12 self.paths.update(paths)
一旦你有了這個文件,把單元測試骨架改成這樣:
ex47_tests.py
1 from nose.tools import *
2 from ex47.game import Room
3
4
5 def test_room():
6 gold = Room("GoldRoom",
7 """This room has gold in it you can grab. There's a
8 door to the north.""")
9 assert_equal(gold.name, "GoldRoom")
10 assert_equal(gold.paths, {})
11
12 def test_room_paths():
13 center = Room("Center", "Test room in the center.")
14 north = Room("North", "Test room in the north.")
15 south = Room("South", "Test room in the south.")
16
17 center.add_paths({'north': north, 'south': south})
18 assert_equal(center.go('north'), north)
19 assert_equal(center.go('south'), south)
20
21 def test_map():
22 start = Room("Start", "You can go west and down a hole."
23 west = Room("Trees", "There are trees here, you can go east.")
24 down = Room("Dungeon", "It's dark down here, you can go up.")
25
26 start.add_paths({'west': west, 'down': down})
27 west.add_paths({'east': start})
28 down.add_paths({'up': start})
29
30 assert_equal(start.go('west'), west)
31 assert_equal(start.go('west').go('east'), start)
32 assert_equal(start.go('down').go('up'), start)
這個文件引入了你在 ex47.game 模塊中的 Room 類,這樣你就能在這上面進行測試。然后是一系列以 test_ 開頭的函數來進行的測試。在每一個測試用例中都有一小段代碼,它們會創建一個或多個房間,然后去確認房間的功能和你期望的是否一樣。它先測試了基本的房間功能,然后測試了路徑,最后測試了整個地圖。
這里最重要的函數是 assert_equal ,它保證了你設置的變量,以及你在 Room 里設置的路徑和你的期望相符。如果你得到錯誤的結果,nosetests 將會打印出一個錯誤信息,這樣你就可以找到出錯的地方并修正過來。
測試指南
在測試時,你可以照著下面這些不是很嚴格的指南來做:
測試腳本要放到 tests/ 目錄下,并且命名為 BLAH_tests.py ,否則 nosetests 就不會執行你的測試腳本了。這樣做還有一個好處就是防止測試代碼和別的代碼互相混淆。
ai醬注: 這里的 BLAH_tests.py 是一種調皮的寫法(BLAH是廢話的意思),你應該把 BLAH 替換為你的 NAME,在這個練習中就是 ex47。
為你創建的每個模塊寫一個測試。
測試用例(函數)盡量保持簡短,但如果看上去不怎么整齊也沒關系,測試用例一般都有點亂。
就算測試用例有些亂,也要試著讓他們保持整潔,把里邊重復的代碼刪掉。創建一些輔助函數來避免重復的代碼。當你下次在改完代碼需要改測試的時候,你會感謝我這一條建議的。重復的代碼會讓修改測試變得很難操作。
最后一條是別太把測試當回事。有時候,更好的方法是把代碼和測試全部刪掉,然后重新設計代碼。
你會看到
Exercise 47 會話
$ nosetests
...
-----------------------------------------------------------------
Ran 3 tests in 0.008s OK
如果一切正常的話你應該會看到這個。試著搞一個錯誤,看看輸出結果是什么,然后再把代碼修改正確。
附加練習
閱讀 nosetests 相關文檔,再去了解一下其他替代方案。
了解一下 Python 的 “doc tests”,看看你是不是更喜歡這種測試方式。
改進你游戲里的 Room,然后用它重建你的游戲,這次重寫,你需要一邊寫代碼,一邊把單元測試寫出來。
常見問題
我運行 nosetests 的時候收到了一個語法錯誤(syntax error) 如果你收到這樣的提示,看一下錯誤提示是怎么說的,然后修改出錯的哪一行或者之前的一行。像 nosetests 這樣的工具是運行你的代碼和測試代碼,所以它們會在運行 Python 的同時發現語法錯誤。
我為什么沒辦法引入 ex47.game ? 確認你創建了 ex47/__init__.py 文件,回到練習 46 看看如何創建。如果問題不是出在這兒,那么你可以這樣做:
macOS/Linux 系統:
export PYTHONPATH=.
Windows 系統:
$env :PYTHONPATH = "$env :PYTHONPATH ; . "
最后,確保你是用 nosetests 來進行測試,而不是在用 Python。
我運行 nosetests 的時候看到了 UserWarning。 你可能裝了兩個版本的 Python,或者你不是用的 distribute,回去跟著練習 46 安裝一下 distribute 或者 pip 就可以了。
總結
以上是生活随笔為你收集整理的笨办法学python47详解_练习 47 - 自动化测试 - 笨办法学Python3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scala条件替换_scala - 有没
- 下一篇: layui列表显示缩略图_layUI实现