Web程序開發過程通常包括如下幾個階段:[需求分析,設計階段,實現階段,測試階段]。其中測試階段經過人工或自動來運行測試某個系統的功能。目的是檢驗其是否知足需求,並得出特定的結果,以達到弄清楚預期結果和實際結果之間的差異的最終目的。python
測試從軟件開發過程能夠分爲:mysql
在衆多的測試中,與程序開發人員最密切的就是單元測試,由於單元測試是由開發人員進行的,而其餘測試都由專業的測試人員來完成。因此咱們主要學習單元測試。sql
程序開發過程當中,寫代碼是爲了實現需求。當咱們的代碼經過了編譯,只是說明它的語法正確,功能可否實現則不能保證。 所以,當咱們的某些功能代碼完成後,爲了檢驗其是否知足程序的需求。能夠經過編寫測試代碼,模擬程序運行的過程,檢驗功能代碼是否符合預期。數據庫
單元測試就是開發者編寫一小段代碼,檢驗目標代碼的功能是否符合預期。一般狀況下,單元測試主要面向一些功能單一的模塊進行。express
舉個例子:一部手機有許多零部件組成,在正式組裝一部手機前,手機內部的各個零部件,CPU、內存、電池、攝像頭等,都要進行測試,這就是單元測試。json
在Web開發過程當中,單元測試實際上就是一些「斷言」(assert)代碼。session
斷言就是判斷一個函數或對象的一個方法所產生的結果是否符合你指望的那個結果。 python中assert斷言是聲明布爾值爲真的斷定,若是表達式爲假會發生異常。單元測試中,通常使用assert來斷言結果。app
斷言語句相似於:函數
if not expression: raise AssertionError AssertionError
經常使用的斷言方法:post
assertEqual 若是兩個值相等,則pass assertNotEqual 若是兩個值不相等,則pass assertTrue 判斷bool值爲True,則pass assertFalse 判斷bool值爲False,則pass assertIsNone 不存在,則pass assertIsNotNone 存在,則pass
簡單的測試用例:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,
def fibo(x): if x == 0: resp = 0 elif x == 1: resp = 1 else: return fibo(x-1) + fibo(x-2) return resp assert fibo(5) == 5
首先,定義一個類,繼承自unittest.TestCase
import unittest class TestClass(unitest.TestCase): pass
其次,在測試類中,定義兩個測試方法
import unittest class TestClass(unittest.TestCase): #該方法會首先執行,方法名爲固定寫法 def setUp(self): pass #該方法會在測試代碼執行完後執行,方法名爲固定寫法 def tearDown(self): pass
最後,在測試類中,編寫測試代碼
import unittest class TestClass(unittest.TestCase): #該方法會首先執行,至關於作測試前的準備工做 def setUp(self): pass #該方法會在測試代碼執行完後執行,至關於作測試後的掃尾工做 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') # 判斷參數是否爲空 if not all([username, password]): result = { "errcode": -2, "errmsg": "params error" } return jsonify(result) # a = 1 / 0 # 若是帳號密碼正確 # 判斷帳號密碼是否正確 if username == 'skylark' and password == 'python': result = { "errcode": 0, "errmsg": "success" } return jsonify(result) else: result = { "errcode": -1, "errmsg": "wrong username or password" } return jsonify(result)
import json import 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): """測試用戶名與密碼爲空的狀況[當參數不全的話,返回errcode=-2]""" response = app.test_client().post('/login', data={}) json_data = response.data json_dict = json.loads(json_data) self.assertIn('errcode', json_dict, '數據格式返回錯誤') self.assertEqual(json_dict['errcode'], -2, '狀態碼返回錯誤') # TODO 測試用戶名爲空的狀況 # TODO 測試密碼爲空的狀況 def test_error_username_password(self): """測試用戶名和密碼錯誤的狀況[當登陸名和密碼錯誤的時候,返回 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, '數據格式返回錯誤') self.assertEqual(json_dict['errcode'], -1, '狀態碼返回錯誤') # TODO 測試用戶名錯誤的狀況 # TODO 測試密碼錯誤的狀況 if __name__ == '__main__': unittest.main()
#coding=utf-8 import unittest from author_book import * #自定義測試類,setUp方法和tearDown方法會分別在測試先後執行。以test_開頭的函數就是具體的測試代碼。 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='skylark') bk = Book(info='python') db.session.add_all([au,bk]) db.session.commit() author = Author.query.filter_by(name='skylark').first() book = Book.query.filter_by(info='python').first() #斷言數據存在 self.assertIsNotNone(author) self.assertIsNotNone(book)