前幾天,在一個群里,一個人問了,這樣一個問題。說他面試遇到一個面試官,問他,為啥unittest的測試用例要用test 開頭,能不能定制化。他不知道為啥。
看到這個題目,我回答當然可以了,可以用leizi開頭。 可能你不信,那么今天雷子來給你實現下。看我說的是不是真的。那么我來實現下,我不修改前,看看用leizi開頭命名的測試用例是否可以執行。
import unittest
class testone(unittest.TestCase):
def leizi1(self):
self.assertTrue(True)
def leizi2(self):
self.assertTrue(True)
def testone(self):
self.assertTrue(True)
if __name__=="__main__": unittest.main()
運行:
就運行了一個測試用例。leizi開頭的測試用例沒有執行。我要變,我要讓它只執行leizi開頭的測試用例。
經過我的修改,我們看下,還是上面的測試用例,我們看下執行結果
執行了兩個測試用例,到底是不是leizi開頭的呢,我們來打印下,看看是否執行的是leizi的用例。
import unittest
class testone(unittest.TestCase):
def setUp(self) -> None:pass
def tearDown(self) -> None:pass
def leizi1(self):
print("leizitest")
self.assertTrue(True)
def leizi2(self):
print("leizitest")
self.assertTrue(True)
def testone(self):
self.assertTrue(True)if __name__=="__main__":
unittest.main()
結果:
打印的結果與預期完全一致。那么雷子是怎么做到的,我先來給你解析一下。首先我們使用的unittest.main()加載運行的測試用例,我們可以去找這個main方法,在源碼中可以發現
我們可以看到有這個TestProgram這個里面的,有這么一個函數,那么我們對應的去看看這個里面的方法 。
默認加載的是defaultTestLoader,那么我去看看這里面有沒有我們想要的。
這里我們可以看到 是一個類,這里有個定義的 test,我們看看。接下來是怎么用的。
我們可以搜索下,在這個類里面下面有一個獲取測試用例名稱的,這個地方判斷了 測試用例名稱調用了這個值,我們可以改下試試,testMethodPrefix的值改成leizi試試。還是上面的測試函數。
import unittest
class testone(unittest.TestCase):
def leizi1(self):
print("leizitest")
self.assertTrue(True)
def leizi2(self):
print("leizitest")
self.assertTrue(True)
def testone(self):
self.assertTrue(True)if __name__=="__main__":
unittest.main()
結果:
只執行了leizi開頭的,我們修改成功了。
回到上面這個面試題。我們在面試的時候都會遇到這種情況,其實這個時候我們如果沒有做過或者看過源碼,可以回答,在我目前的得到的知識中,就是以test開頭的,但是要是定制,我要看下源碼,是否可以定制。如果你看過源碼,那就直接說 我知道在哪個文件下面的 什么值可以直接修改。
面試不難,面試題也不難。
學會解答,能給出方案來。
唯有變化,應對萬變題目。
題目唯一,方案千變萬化。
合理思路,方案有理有據。
基於需求,給定方案即可。
關注雷子說測試,每天帶你分享不一樣的東西。
如果你感覺有用,可以收藏,分享給大家。幫助大家一起成長。
有問題也可以和我交流。qq&微信:952943386