一、模塊的導入方式
1、 import方式導入(絕對導入):在后續(xù)代碼中調用此模塊中的類,函數(shù),屬性等都是通過:模塊名.函數(shù)名、模塊名.類名、模塊名.屬性名的方式調用。
import datetime
import time
print("import方式導入:")
print(datetime.datetime.now())
print(time.time())
結果:
import方式導入:
2019-07-09 09:22:58.838245
1562635378.8382452
2、 form...import 方式導入(相對導入):在后續(xù)代碼中調用此模塊中的類,函數(shù),屬性等都是通過直接寫類名,函數(shù)名,屬性名。
from datetime import datetime
from time import *
print("form...import方式導入:")
print(datetime.now())
print(time())
結果:
form...import方式導入:
2019-07-09 09:23:23.161034
1562635403.1610339
二、模塊的調用
從上例可以知道,在python中能直接調用系統(tǒng)模塊,同理,也可以調用自己創(chuàng)建的模塊,尤其在自動化測試中,調用執(zhí)行測試用例時,用得比較多,一般分為同級目錄調用和跨目錄模塊調用。
1、同級目錄模塊調用
在test_case目錄下,創(chuàng)建了test_a.py以及test_b.py文件,它兩是同一目錄下的文件。

test_a.py文件:
print('this is test_a')
test_b.py文件:
import test_a
print('this is test_b')
執(zhí)行test_b.py能正常執(zhí)行
this is test_a
this is test_b
2、跨目錄模塊調用
在test_case目錄下,創(chuàng)建了test_aaa文件夾,并在其下創(chuàng)建了test_a.py以及test_ccc文件夾,在test_ccc文件下創(chuàng)建了test_c.py文件,現(xiàn)在test_a.py和test_c.py它兩是不在同一目錄下。

test_a.py文件:
import test_c
print('this is test_a')
test_c.py文件:
print('this is test_c')
執(zhí)行test_a.py文件時,提示錯誤:不能找到模塊
import test_c
ModuleNotFoundError: No module named 'test_c'
在之前同一級目錄下,都能運行,不同目錄下就出現(xiàn)問題了。這是為什么呢?要理解它,需要知道執(zhí)行import語句時,到底發(fā)生了什么?總結如下:
- 第一步,創(chuàng)建一個新的module對象;
- 第二步,把這個module對象插入到sys.module中;
- 第三步,找到module程序所在位置,轉載module的代碼。這里需要注意的是程序查找的順序方法,首先,是找當前路徑(以及當前目錄指定的sys.path),然后是PythonPATH,再然后是python的安裝路徑。如果當前路徑存在或PythonPATH中存在與標準module同樣名稱的模塊時,則會執(zhí)行當前路徑存在或PythonPATH中存在的模塊,所以在給文件名取名稱時需要注意;
- 第四步,執(zhí)行新的module中對應的代碼。
了解原理后,就明白了,在引入在不同目錄下的模塊時,import不能找到執(zhí)行的模塊,那么需要指定相應的路徑才能找到并執(zhí)行。如下:
import sys
sys.path.append(r'E:\python\unittest_test\test_case\test_aaa\test_ccc')
import test_c
print('this is test_a')
結果:已經(jīng)能找到并執(zhí)行程序
this is test_c
this is test_a
三、包管理
包的定義:一個包(package)就是放在一個文件夾里的模塊集合。包的名字就是文件夾的名字。
現(xiàn)在考慮實際工作中的使用場景,在執(zhí)行測試用例時,眾多的測試用例可能分布在不同目錄層級下的文件中,也就是包中國。此時,需要用到python中的dicover函數(shù),它會自動查找到我們想要的測試用例腳本文件,而不用我們手動去加入每個測試用例腳本文件名稱。比如:
if __name__ == '__main__':
#構造測試集
suite = unittest.TestSuite()
suite.addTest('test_a')#手動加入每個測試用例腳本文件名稱
suite.addTest('test_b')#手動加入每個測試用例腳本文件名稱
suite.addTest('test_c')#手動加入每個測試用例腳本文件名稱
#執(zhí)行測試
runner = unittest.TextTestRunner()
runner.run(suite)
當測試用例成百上千時,手動的效率可想而知是如何低下,于是輪到dicover函數(shù)出場:
import unittest
unittest.defaultTestLoader.discover(start_dir=,pattern='test*.py',top_level_dir=None)
discover(start_dir=,pattern='test*.py',top_level_dir=None)
- start_dir:要測試的模塊名或者測試用例目錄;
- pattern:表示用例文件名的匹配原則。比如:pattern='test.py',這里匹配的是test開頭的.py類型的文件,星號“”表示任意多個字符;
- top_level_dir:測試模塊的頂層目錄。如果沒有,默認為None。
現(xiàn)在用dicover函數(shù)方法去查找不同目錄下的測試用例腳本文件,比如:執(zhí)行test_one.py文件,找到并執(zhí)行test_a.py、test_b.py和test_c.py文件。

執(zhí)行test_one.py文件:
import unittest
test_dir = r'E:\python\unittest_test\test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
結果:沒有找到,也沒有執(zhí)行任何的測試用例
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
這是為什么?因為我們在執(zhí)行程序的時候要告訴python,我們的測試用例放在哪些包中,那怎么告訴python呢?其實很簡單,也就是把一個名為__ init__.py的文件(通常是文件內容為空)放在文件夾中。比如:

現(xiàn)在我們再次執(zhí)行test_one.py文件,看能否找到并執(zhí)行test_a.py、test_b.py和test_c.py文件。
import unittest
test_dir = r'E:\python\unittest_test\test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
結果:已經(jīng)能成功找到!
this is test_a
this is test_c
this is test_b
這里需要注意,unittest框架默認根據(jù)ASCII碼的順序加載測試用例,數(shù)字與字母的順序為:09,AZ,a~z。所以你會看到以上的執(zhí)行結果,因為它查找到的文件夾名稱的順序是先test_aaa,然后是test_bbb。所以先執(zhí)行test_a.py,再test_c.py,最后test_b.py。

四、使用模塊或者引入模塊的時候需要注意哪些?
1、使用模塊的時候需要注意:
模塊名要遵循python的命名規(guī)范,也就是盡量使用小寫命名,首字母保持小寫,盡量不要用下劃線(除非多個單詞,且數(shù)量不多的情況),
不要使用中文或者特殊字符。
模塊名不要和系統(tǒng)模塊名沖突,最好先檢查系統(tǒng)是否已經(jīng)存在該模塊,檢查的方法是在python的交互環(huán)境中執(zhí)行import XXX,
若成功,則說明存在此模塊。可以通過import導入數(shù)據(jù),另外,需要注意變量的作用域。
自己創(chuàng)建模塊名稱時,要注意命名,不能和python自帶的模塊名稱沖突。
2、引入模塊的時候需要注意:
import導入幾個模塊時,要用逗號進行分開。
模塊名字太長可以取別名,比如:import XX as xx等
from import,是從模塊名引入方法名