今日內(nèi)容
-
異常
-
模塊和包
- 導(dǎo)入模塊(導(dǎo)包)
if __name__ == "__main__":
-
Unitest 框架的學(xué)習(xí)
- 了解, 基本組成
異常
異常傳遞[了解]
異常傳遞是 Python 中已經(jīng)實(shí)現(xiàn)好了,我們不需要操作, 我們知道異常會(huì)進(jìn)行傳遞.
?
異常傳遞: 在函數(shù)嵌套調(diào)用的過(guò)程中, 被調(diào)用的函數(shù) ,發(fā)生了異常,如果沒有捕獲,會(huì)將這個(gè)異常向外層傳遞. .... 如果傳到最外層還沒有捕獲,才報(bào)錯(cuò)
模塊和包
1. Python 源代碼文件就是一個(gè)模塊
2. 模塊中定義的變量 函數(shù) 類,都可以讓別人使用,同樣,可以使用別人定義的(好處: 別人定義好的不需要我們?cè)俅螘鴮?直接使用即可)
3. 想要使用 別人的模塊中的內(nèi)容工具(變量, 類, 函數(shù)), 必須先導(dǎo)入模塊 才可以
4. 我們自己寫的代碼,想要作為模塊使用,代碼的名字需要滿足標(biāo)識(shí)符的規(guī)則(由數(shù)字,字母下劃線組成,不能以數(shù)字開頭)
導(dǎo)入模塊的語(yǔ)法
方式一
import 模塊名
# 使用模塊中的內(nèi)容
模塊名.工具名
?
# 舉例
import random
import json
random.randint(a, b)
json.load()
json.dump()
方式二
from 模塊名 import 工具名
# 使用
工具名 ?# 如果是函數(shù)和類需要加括號(hào)
?
# 舉例
from random import randint
from json import load, dump
randint(a, b)
load()
dump()
方式三 [了解] 基本不用
from 模塊名 import * ?# 將模塊中所有的內(nèi)容都導(dǎo)入
?
from random import *
from json import *
?
randint(a, b)
load()
dump()
# 方式一 重點(diǎn)記憶
# import random
#
# print(random.randint(1, 20))
?
# 方式二, 重要快捷方式導(dǎo)包
# from random import randint
# from random import randint
#
# print(randint(1, 20))
?
# 方式三, 問題: 可能存在多個(gè)模塊中有相同的名字的工具, 會(huì)產(chǎn)生沖突
from random import *
?
print(randint(1, 20))
?
對(duì)于導(dǎo)入的模塊和工具可以使用 as 關(guān)鍵字給其起別名
注意: 如果起別名,原來(lái)的名字就不能用了, 只能使用別名
模塊的查找順序
在導(dǎo)入模塊的時(shí)候 會(huì)先在當(dāng)前目錄中找模塊, 如果找到,就直接使用
如果沒有找到回去系統(tǒng)的目錄中進(jìn)行查找, 找到,直接使用
沒有找到, 報(bào)錯(cuò)
?
注意點(diǎn):
定義代碼文件的時(shí)候, 你的代碼名字不能和你要導(dǎo)入的模塊名字相同
__name__?的作用
1. 每個(gè)代碼文件都是一個(gè)模塊
2. 在導(dǎo)入模塊的時(shí)候, 會(huì)執(zhí)行模塊中的代碼(三種方法都會(huì))
3. __name__ 變量
3.1 __name__ 變量 是 python 解釋器自動(dòng)維護(hù)的變量
3.2 __name__ 變量,如果代碼是直接運(yùn)行, 值是 "__main__"
3.3 __name__ 變量, 如果代碼是被導(dǎo)入執(zhí)行, 值是 模塊名(即代碼文件名)
?
在代碼文件中, 在被導(dǎo)入時(shí)不想被執(zhí)行的代碼,可以寫在 if __name__ == "__main__": 代碼的縮進(jìn)中
代碼練習(xí)
1. 定義一個(gè)模塊 tools.py
2. 在模塊中定義一個(gè)函數(shù), func, 輸出 '我是 tools 模塊中的 funn 函數(shù)'
3. 在模塊中定義一個(gè)類, Dog, 具有屬性 name, age, 方法 play, 輸出 'xx 在快樂的玩耍'
4. 新建一個(gè)代碼文件, 調(diào)用 tools 模塊中的 func 函數(shù) 并創(chuàng)建一個(gè) Dog 類的對(duì)象, 調(diào)用 play 方法
包(package)
在 Python 中, 包 是一個(gè)目錄, 只不過(guò)在這個(gè)目錄存在一個(gè)文件 __init__.py(可以是空的)
將功能相近或者相似的代碼放在一起的.
?
--------
在 Python 中使用的時(shí)候,不需要可以是區(qū)分是包還是模塊, 使用方式是一樣的
?
random 模塊 (單個(gè)代碼文件)
json ?包(目錄)
unittest 包(目錄)
?
1. import 包名
2. alt ?回車 快捷導(dǎo)入
UnitTest框架
介紹
-
框架
說(shuō)明:
1. 框架英文單詞framework 2. 為解決一類事情的功能集合
?
> 需要按照框架的規(guī)定(套路) 去書寫代碼
-
什么是UnitTest框架?
概念:UnitTest是Python自帶的一個(gè)單元測(cè)試框架,用它來(lái)做單元測(cè)試。
----
自帶的框架(官方): 不需要單外安裝, 只要安裝了 Python,就可以使用
random, json, os, time
第三方框架: 想要使用 需要先安裝后使用(pytest)
selenium , appium, requests
?
----
單元測(cè)試框架: 主要用來(lái)做單元測(cè)試, 一般單元測(cè)試是開發(fā)做的.
對(duì)于測(cè)試來(lái)說(shuō), unittest 框架的作用是 自動(dòng)化腳本(用例代碼) 執(zhí)行框架(使用 unittest 框架 來(lái) 管理 運(yùn)行 多個(gè)測(cè)試用例的)
-
為什么使用UnitTest框架?
1. 能夠組織多個(gè)用例去執(zhí)行
2. 提供豐富的斷言方法(讓程序代碼代替人工自動(dòng)的判斷預(yù)期結(jié)果和實(shí)際結(jié)果是否相符)
3. 能夠生成測(cè)試報(bào)告
-
UnitTest核心要素(unitest 的組成部分)
-
TestCase(最核心的模塊)
TestCase(測(cè)試用例), 注意這個(gè)測(cè)試用例是 unittest 框架的組成部分, 不是手工和自動(dòng)化中我們所說(shuō)的用例(Test Case)
?
主要作用: 每個(gè) TestCase(測(cè)試用例) 都是一個(gè)代碼文件, ?在這個(gè)代碼文件中 ?來(lái)書寫 真正的用例代碼
-
TestSuite
TestSuite(測(cè)試套件), 用來(lái) 管理 組裝(打包)多個(gè) TestCase(測(cè)試用例) 的
-
TestRunner
TestRunner(測(cè)試執(zhí)行,測(cè)試運(yùn)行), ?用來(lái) 執(zhí)行 TestSuite(測(cè)試套件)的
-
TestLoader
TestLoader(測(cè)試加載), 功能是對(duì) TestSuite(測(cè)試套件) 功能的補(bǔ)充,
管理 組裝(打包)多個(gè) TestCase(測(cè)試用例) 的
-
Fixture
Fixture(測(cè)試夾具), 書寫在 TestCase(測(cè)試用例) 代碼中, 是一個(gè)代碼結(jié)構(gòu), 可以在每個(gè)方法執(zhí)行前后都會(huì)執(zhí)行的內(nèi)容
?
舉例:
登錄的測(cè)試用例, 每個(gè)用例中重復(fù)的代碼就可以寫在 Fixture 代碼結(jié)構(gòu)中, 只寫一遍, 但每次用例方法的執(zhí)行,都會(huì)執(zhí)行 Fixture 中的代碼
1. 打開瀏覽器
2. 輸入網(wǎng)址
?
-
TestCase(測(cè)試用例)
1. 是一個(gè)代碼文件, 在代碼文件中 來(lái)書寫真正的用例代碼
2. 代碼文件的名字必須按照標(biāo)識(shí)符的規(guī)則來(lái)書寫(可以將代碼的作用在文件的開頭使用注釋說(shuō)明)
-
步驟
1. 導(dǎo)包 (unittest)
2. 自定義測(cè)試類
3. 在測(cè)試類中書寫測(cè)試方法
4. 執(zhí)行用例
-
代碼
"""
代碼的目的: 學(xué)習(xí) TestCase(測(cè)試用例)模塊的書寫方法
"""
# 1, 導(dǎo)包
import unittest
?
?
# 2, 自定義測(cè)試類, 需要繼承 unittest 模塊中的 TestCase 類即可
class TestDemo(unittest.TestCase):
? ?# 3, 書寫測(cè)試方法, 即 用例代碼. 目前沒有真正的用例代碼, 使用 print 代替
? ?# 書寫要求, 測(cè)試方法 必須以 test_ 開頭(本質(zhì)是以 test 開頭)
? ?def test_method1(self):
? ? ? ?print('測(cè)試方法 1')
?
? ?def test_method2(self):
? ? ? ?print('測(cè)試方法 2')
?
?
# 4, 執(zhí)行用例(方法)
# 4.1 將光標(biāo)放在 類名的后邊 運(yùn)行, 會(huì)執(zhí)行類中的所有的測(cè)試方法
# 4.2 將光標(biāo)放在 方法名的后邊 運(yùn)行, 只執(zhí)行當(dāng)前的方法
?
問題一 代碼文件的命名不規(guī)范
1. 代碼文件的名字以數(shù)字開頭
2. 代碼文件名字中有空格
3. 代碼文件名字有中文
4. 其他的特殊符號(hào)
(數(shù)字, 字母, 下劃線組成, 不能以數(shù)字開頭)
問題 2 代碼運(yùn)行沒有結(jié)果
右鍵運(yùn)行沒有 unittests for 的提示, 出現(xiàn)的問題
解決方案:
方案1. 重新新建一個(gè)代碼文件, 將寫好的代碼復(fù)制進(jìn)去
方案2. 刪除已有的運(yùn)行方式
問題 3 沒有找到用例
測(cè)試方法中不是以 test_ 開頭的, 或者單詞寫錯(cuò)了
TestSuite & TestRunner
TestSuite(測(cè)試套件): 管理 打包 組裝 TestCase(測(cè)試用例) 文件的
TestRunner(測(cè)試執(zhí)行): 執(zhí)行 TestSuite(套件)
-
步驟
1. 導(dǎo)包(unittest)
2. 實(shí)例化(創(chuàng)建對(duì)象)套件對(duì)象
3. 使用套件對(duì)象添加用例方法
4. 實(shí)例化運(yùn)行對(duì)象
5. 使用運(yùn)行對(duì)象去執(zhí)行套件對(duì)象
-
代碼文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-766461.html
TestSuite(測(cè)試套件): 是用來(lái)管理多個(gè) TestCase(測(cè)試用例) 的,
先創(chuàng)建多個(gè) TestCase(測(cè)試用例) 文件
"""
學(xué)習(xí) TestSuite 和 TestRunner 的使用
"""
# 1. 導(dǎo)包(unittest)
import unittest
from hm_07_testcase1 import TestDemo1
from hm_07_testcase2 import TestDemo2
?
# 2. 實(shí)例化(創(chuàng)建對(duì)象)套件對(duì)象,
suite = unittest.TestSuite()
# 3. 使用套件對(duì)象添加用例方法
# 方式一, 套件對(duì)象.addTest(測(cè)試類名('方法名')) ? # 建議測(cè)試類名和方法名直接去復(fù)制,不要手寫
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
?
# 4. 實(shí)例化運(yùn)行對(duì)象
runner = unittest.TextTestRunner()
# 5. 使用運(yùn)行對(duì)象去執(zhí)行套件對(duì)象
# 運(yùn)行對(duì)象.run(套件對(duì)象)
runner.run(suite)
?
"""
學(xué)習(xí) TestSuite 和 TestRunner 的使用
"""
# 1. 導(dǎo)包(unittest)
import unittest
# 2. 實(shí)例化(創(chuàng)建對(duì)象)套件對(duì)象,
from hm_07_testcase1 import TestDemo1
from hm_07_testcase2 import TestDemo2
?
suite = unittest.TestSuite()
# 3. 使用套件對(duì)象添加用例方法
# 方式二 將一個(gè)測(cè)試類中的所有方法進(jìn)行添加
# 套件對(duì)象.addTest(unittest.makeSuite(測(cè)試類名))
# 缺點(diǎn): makeSuite() 不會(huì)提示
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
?
# 4. 實(shí)例化運(yùn)行對(duì)象
runner = unittest.TextTestRunner()
# 5. 使用運(yùn)行對(duì)象去執(zhí)行套件對(duì)象
# 運(yùn)行對(duì)象.run(套件對(duì)象)
runner.run(suite)
?
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766461.html
練習(xí)
1. 在 tools 模塊中定義 add 函數(shù), 對(duì)兩個(gè)數(shù)字進(jìn)行求和計(jì)算
2. 書寫 TestCase 代碼對(duì) add() 進(jìn)行測(cè)試
用例 1: ?1, 2, 3
用例 2: ?10, 20, 30
用例 3: ?2, 3, 5
- 用例代碼
"""案例練習(xí)"""
# 1,導(dǎo)包
import unittest
from tools import add
?
# 2, 自定義測(cè)試類
?
?
class TestAdd(unittest.TestCase):
? ?# 3. 書寫測(cè)試方法, 就是測(cè)試用例代碼
? ?def test_method1(self):
? ? ? ?# 1, 2, 3 判斷實(shí)際結(jié)果和預(yù)期結(jié)果是否相符
? ? ? ?if add(1, 2) == 3:
? ? ? ? ? ?print('測(cè)試通過(guò)')
? ? ? ?else:
? ? ? ? ? ?print('測(cè)試不通過(guò)')
?
? ?def test_method2(self):
? ? ? ?if add(10, 20) == 30:
? ? ? ? ? ?print('測(cè)試通過(guò)')
? ? ? ?else:
? ? ? ? ? ?print('測(cè)試不通過(guò)')
?
? ?def test_method3(self):
? ? ? ?# 1, 2, 3 判斷實(shí)際結(jié)果和預(yù)期結(jié)果是否相符
? ? ? ?if add(2, 3) == 5:
? ? ? ? ? ?print('測(cè)試通過(guò)')
? ? ? ?else:
? ? ? ? ? ?print('測(cè)試不通過(guò)')
?
- 套件和執(zhí)行的代碼
import unittest
?
# 實(shí)例化套件對(duì)象
from hm_08_test import TestAdd
?
suite = unittest.TestSuite()
# 添加測(cè)試方法
suite.addTest(unittest.makeSuite(TestAdd))
# 實(shí)例化執(zhí)行對(duì)象
runner = unittest.TextTestRunner()
runner.run(suite)
到了這里,關(guān)于10天玩轉(zhuǎn)Python第9天:python 面向?qū)ο?全面詳解與代碼示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!