Web程序開發(fā)過程一般包括以下幾個(gè)階段:[需求分析,設(shè)計(jì)階段,實(shí)現(xiàn)階段,測試階段]。其中測試階段通過人工或自動來運(yùn)行測試某個(gè)系統(tǒng)的功能。目的是檢驗(yàn)其是否滿足需求,并得出特定的結(jié)果,以達(dá)到弄清楚預(yù)期結(jié)果和實(shí)際結(jié)果之間的差別的最終目的。
目前創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、布爾津網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
測試從軟件開發(fā)過程可以分為:
單元測試
對單獨(dú)的代碼塊(例如函數(shù))分別進(jìn)行測試,以保證它們的正確性
集成測試
對大量的程序單元的協(xié)同工作情況做測試
系統(tǒng)測試
同時(shí)對整個(gè)系統(tǒng)的正確性進(jìn)行檢查,而不是針對獨(dú)立的片段
在眾多的測試中,與程序開發(fā)人員最密切的就是單元測試,因?yàn)閱卧獪y試是由開發(fā)人員進(jìn)行的,而其他測試都由專業(yè)的測試人員來完成。所以我們主要學(xué)習(xí)單元測試。
程序開發(fā)過程中,寫代碼是為了實(shí)現(xiàn)需求。當(dāng)我們的代碼通過了編譯,只是說明它的語法正確,功能能否實(shí)現(xiàn)則不能保證。 因此,當(dāng)我們的某些功能代碼完成后,為了檢驗(yàn)其是否滿足程序的需求??梢酝ㄟ^編寫測試代碼,模擬程序運(yùn)行的過程,檢驗(yàn)功能代碼是否符合預(yù)期。
單元測試就是開發(fā)者編寫一小段代碼,檢驗(yàn)?zāi)繕?biāo)代碼的功能是否符合預(yù)期。通常情況下,單元測試主要面向一些功能單一的模塊進(jìn)行。
舉個(gè)例子:一部手機(jī)有許多零部件組成,在正式組裝一部手機(jī)前,手機(jī)內(nèi)部的各個(gè)零部件,CPU、內(nèi)存、電池、攝像頭等,都要進(jìn)行測試,這就是單元測試。
在Web開發(fā)過程中,單元測試實(shí)際上就是一些“斷言”(assert)代碼。
斷言就是判斷一個(gè)函數(shù)或?qū)ο蟮囊粋€(gè)方法所產(chǎn)生的結(jié)果是否符合你期望的那個(gè)結(jié)果。 python中assert斷言是聲明布爾值為真的判定,如果表達(dá)式為假會發(fā)生異常。單元測試中,一般使用assert來斷言結(jié)果。
斷言語句類似于:
if not expression: raise AssertionError AssertionError
常用的斷言方法:
assertEqual 如果兩個(gè)值相等,則pass assertNotEqual 如果兩個(gè)值不相等,則pass assertTrue 判斷bool值為True,則pass assertFalse 判斷bool值為False,則pass assertIsNone 不存在,則pass assertIsNotNone 存在,則pass
# 示例1:
def fibo(x): if x == 0: resp = 0 elif x == 1: resp = 1 else: return fibo(x-1) + fibo(x-2) return respassert fibo(5) == 5
首先,定義一個(gè)類,繼承自unittest.TestCase
import unittestclass TestClass(unitest.TestCase): pass
其次,在測試類中,定義兩個(gè)測試方法
import unittestclass TestClass(unittest.TestCase): #該方法會首先執(zhí)行,方法名為固定寫法 def setUp(self): pass #該方法會在測試代碼執(zhí)行完后執(zhí)行,方法名為固定寫法 def tearDown(self): pass
最后,在測試類中,編寫測試代碼
import unittestclass TestClass(unittest.TestCase): #該方法會首先執(zhí)行,相當(dāng)于做測試前的準(zhǔn)備工作 def setUp(self): pass #該方法會在測試代碼執(zhí)行完后執(zhí)行,相當(dāng)于做測試后的掃尾工作 def tearDown(self): pass #測試代碼 def test_app_exists(self): pass
被測試的代碼邏輯
@app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') # 判斷參數(shù)是否為空 if not all([username, password]): result = { "errcode": -2, "errmsg": "params error" } return jsonify(result) # a = 1 / 0 # 如果賬號密碼正確 # 判斷賬號密碼是否正確 if username == 'itheima' and password == 'python': result = { "errcode": 0, "errmsg": "success" } return jsonify(result) else: result = { "errcode": -1, "errmsg": "wrong username or password" } return jsonify(result)
單元測試代碼
import jsonimport unittest from demo1_login import app class LoginTest(unittest.TestCase): """為登錄邏輯編寫測試案例""" def setUp(self): app.testing = True self.client = app.test_client() def test_empty_username_password(self): """測試用戶名與密碼為空的情況[當(dāng)參數(shù)不全的話,返回errcode=-2]""" response = app.test_client().post('/login', data={}) json_data = response.data json_dict = json.loads(json_data) self.assertIn('errcode', json_dict, '數(shù)據(jù)格式返回錯誤') self.assertEqual(json_dict['errcode'], -2, '狀態(tài)碼返回錯誤') # TODO 測試用戶名為空的情況 # TODO 測試密碼為空的情況 def test_error_username_password(self): """測試用戶名和密碼錯誤的情況[當(dāng)?shù)卿浢兔艽a錯誤的時(shí)候,返回 errcode = -1]""" response = app.test_client().post('/login', data={"username": "aaaaa", "password": "12343"}) json_data = response.data json_dict = json.loads(json_data) self.assertIn('errcode', json_dict, '數(shù)據(jù)格式返回錯誤') self.assertEqual(json_dict['errcode'], -1, '狀態(tài)碼返回錯誤') # TODO 測試用戶名錯誤的情況 # TODO 測試密碼錯誤的情況 if __name__ == '__main__': unittest.main()
#coding=utf-8import unittestfrom author_book import *#自定義測試類,setUp方法和tearDown方法會分別在測試前后執(zhí)行。以test_開頭的函數(shù)就是具體的測試代碼。class DatabaseTestCase(unittest.TestCase): def setUp(self): app.config['TESTING'] = True app.config['SQLALCHEMY_DATABASE_URI'] = 'MySQL://root:mysql@localhost/test0' self.app = app db.create_all() def tearDown(self): db.session.remove() db.drop_all() #測試代碼 def test_append_data(self): au = Author(name='itcast') bk = Book(info='python') db.session.add_all([au,bk]) db.session.commit() author = Author.query.filter_by(name='itcast').first() book = Book.query.filter_by(info='python').first() #斷言數(shù)據(jù)存在 self.assertIsNotNone(author) self.assertIsNotNone(book)
本文題目:Python之單元測試以及斷言assert的使用
文章來源:http://muchs.cn/article6/gjsdig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、服務(wù)器托管、網(wǎng)站營銷、企業(yè)建站、網(wǎng)站排名、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)