python单元测试案例

什么是单元测试?

程序开发过程中,写代码是为了实现需求。当我们的代码通过了编译,只是说明它的语法正确,功能能否实现则不能保证。 因此,当我们的某些功能代码完成后,为了检验其是否满足程序的需求。可以通过编写测试代码,模拟程序运行的过程,检验功能代码是否符合预期。

单元测试就是开发者编写一小段代码,检验目标代码的功能是否符合预期。通常情况下,单元测试主要面向一些功能单一的模块进行。

举个例子:一部手机有许多零部件组成,在正式组装一部手机前,手机内部的各个零部件,CPU、内存、电池、摄像头等,都要进行测试,这就是单元测试。

在Web开发过程中,单元测试实际上就是一些“断言”(assert)代码。

断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。 python中assert断言是声明布尔值为真的判定,如果表达式为假会发生异常。单元测试中,一般使用assert来断言结果。

断言方法的使用:

断言语句类似于:

if not expression:       raise AssertionError AssertionError

1

2

3

if not expression:   

    raise AssertionError

 AssertionError

常用的断言方法:

1

2

3

4

5

6

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,

1

2

3

4

5

6

7

8

9

def fibo(x):

    if == 0:

        resp = 0

    elif == 1:

        resp = 1

    else:

        return fibo(x-1+ fibo(x-2)

    return resp

assert fibo(5== 5

单元测试的基本写法:

首先,定义一个类,继承自unittest.TestCase

1

2

3

import unittest

class TestClass(unitest.TestCase):

    pass

其次,在测试类中,定义两个测试方法

1

2

3

4

5

6

7

8

9

10

import unittest

class TestClass(unittest.TestCase):

 

    #该方法会首先执行,方法名为固定写法

    def setUp(self):

        pass

 

    #该方法会在测试代码执行完后执行,方法名为固定写法

    def tearDown(self):

        pass

最后,在测试类中,编写测试代码

1

2

3

4

5

6

7

8

9

10

11

12

13

import unittest

class TestClass(unittest.TestCase):

 

    #该方法会首先执行,相当于做测试前的准备工作

    def setUp(self):

        pass

 

    #该方法会在测试代码执行完后执行,相当于做测试后的扫尾工作

    def tearDown(self):

        pass

    #测试代码

    def test_app_exists(self):

        pass

登录测试

  • 被测试的代码逻辑

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    @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)

  • 单元测试代码  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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()

数据库测试:

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#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)

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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值