python测试代码怎么写(python自动化测试面试题)

Python 对于测试非常看重,例如测试中最常见的操作——断言 assert,其在 Python 中就是一个关键字而不是一个函数。而在 C 语言中,assert 只是一个普通的函数。从这点也可以看出,Python 将测试当作最基础的部分。
可以通过使用下面的代码来查看 Python 语言定义的关键字:

>>> import keyword                                     # 引入模块keyword
>>> keyword.kwlist                                     # 得到所有的关键字
# 关键字列表
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
'break', 'class', 'continue', 'def', 'del', 'elif', 'else',
'except', 'finally', 'for', 'from', 'global', 'if', 'import',
'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass',
'raise', 'return', 'try', 'while', 'with', 'yield']

可以直接是使用 assert 在源代码中对其进行测试,常用的做法如图 1 所示。

python测试代码怎么写(python自动化测试面试题)

图 1 将测试代码和实现功能放入同一个文件

下面看一个简单的例子,假定自定义了一个模块 sampleAssert,其代码如下:

def int_list_sort(input_list):          # 被测对象,完成对输入的整数列表排序
    input_list.sort()                   # 完成排序
if __name__ == "__main__":                      # 判断条件,里面的内容是用来测试的
    def test_normal_positive_input():                   # 定义一个测试用例
        input_list = [3, 5, 9, 1, 8]
        int_list_sort(input_list)
        assert input_list == [1, 3, 5, 8, 9]
        print("test_normal_positive_input: PASS")
    test_normal_positive_input()                         # 执行测试用例

如果我们是 import(引入)该模块,case 是不会执行的,即第 3 行开始的块是不会执行的,所以包含在该块内的测试用例定义不会被看到,测试用例也不会被执行。

$ python                                       # 启动解释器,Python 3
Python 3.7.3 (default, Mar 27 2022, 16:54:48)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sampleAssert                        # 引入我们刚才定义的模块
>>> sampleAssert.test_normal_positive_input()  # 测试函数是不可见的
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: module 'sampleAssert' has no attribute 'test_normal_
        positive_input'
>>> list_obj = [3, 1, 6, 100, 98, 9]
>>> sampleAssert.int_list_sort(list_obj)         # 被测对象是可见的
>>> list_obj
[1, 3, 6, 9, 98, 100]                            # 排序后的结果

如果是直接运行该脚本,则测试用例就会被触发。

$ python sampleAssert.py
test_normal_positive_input: PASS

下面我们来实现一个冒泡排序法,其仅对整数列表有效。冒泡排序法是最简单的排序法,其通过交换相邻的元素来实现排序。下面以对包含 4 个元素 3、1、5、2 的列表进行排序为例来解释这个过程,如图 2 所示。

python测试代码怎么写(python自动化测试面试题)

图 2 冒泡排序

首先从尾部,也就是下部依次查找不符合排列要求的相邻两个数,第一次找到的是 5 和 2,交换它们,然后继续查找得到 3 和 1 这两个不符合要求的相邻数,交换它们。通过这一轮的交换,最小的数交换到了第一个元素。然后继续其他记录的排序,第二轮可以保证第二小的数排到第二个位置上。以此类推,最多经过 n-1 轮就可以完成所有数据的排序。

在这个例子中,经过了两轮就完成了所有数据的排序。

下面是完整的实现代码和相关测试代码:

本文转载自:https://www.gylmap.com

def bubble_sort(input_list):                    # 被测函数,冒泡排序
    if type(input_list) is not type([]):        # 如果输入参数不符合要求
        print("Invalid Input Type")
        return None
    for x in input_list:                                # 有元素不是整数,返回None
        if type(x) != int:
            return None
    input_len = len(input_list)
    print()
    print("Origin:", input_list)
    if input_len  input_list[y]:
                input_list[y-1], input_list[y] = input_list[y], input_
                        list[y-1]
                swap_happens = True
        if swap_happens == False:               # 上一轮没有交换数据,已经排序完毕
            break
        print("Temp %d:" % x, input_list)
    return input_list                                   # 返回排序完毕的列表
if __name__ == "__main__":                              # 如果是运行该脚本而不是引入该脚本
    import random                                               # 测试代码开始
    def test_empty_input():                             # 如果输入的列表为空
        input = []
        output = bubble_sort(input)
        assert type(output) == type([])
        assert len(output) == 0
    def test_invalid_input():                   # 如果输入的不是列表
        output = bubble_sort(1)
        assert output is None
    def test_one_element():                     # 如果列表仅包含一个元素
        input = [1, ]
        output = bubble_sort(input)
      assert type(output) == type([])
      assert len(output) == 1
      assert output[0] == 1
    def test_neg_one_element():         # 如果列表仅包含一个元素,而且不是整数
      input = ["name", ]
       output = bubble_sort(input)
       assert output is None
    def test_two_element():                     # 如果列表仅包含两个元素
       input = [18, 8]
        output = bubble_sort(input)
        assert type(output) == type([])
        assert len(output) == 2
        assert output[0] == 8
        assert output[1] == 18
    def test_neg_two_element():         # 如果列表包含两个元素,但并不都是整数
        input = [1, "name"]
        output = bubble_sort(input)
        assert output is None
    def test_normal_pos():                              # 正常输入
        input = [88, 1, 20, 8, 9, 21, 98, 76]
        output = bubble_sort(input)
        expected_output = [1, 8, 9, 20, 21, 76, 88, 98]
        assert output == expected_output
    def test_dup_elements():                    # 如果有重复的元素
        input = [88, 1, 20, 8, 9, 21, 98, 8, 76]        # 两个8
        print("input:", input)
        output = bubble_sort(input)
        print("outpout:", output)
        expected_output = [1, 8, 8, 9, 20, 21, 76, 88, 98]
        assert output == expected_output
    def test_all_same():                                # 如果所有元素都相等
        input = [8, 8, 8, 8, 8, 8]              # 所有的输入元素相同
        output = bubble_sort(input)
        expected_output = [8, 8, 8, 8, 8, 8]
        assert output == expected_output
    def random_test():                                  # 随机生成测试数据
        # 生成随机的输入数据
        expected_list_len = random.randint(10, 100)
        input_list = []
        for x in range(expected_list_len):
            input_list.append(random.randint(-100, 100))
        input_len = len(input_list)
        org_input = input_list.copy()           # 备份一下元素数据
        output = bubble_sort(input_list)
        print("org_input", org_input)
        #input_len = len(org_input)
        assert len(output) == expected_list_len
        for pos in range(input_len-1):
            val = output[pos]
            # 该数据在原始列表中存在
            # 这样可以确保所有结果列表中的数据都是来自输入列表
            assert val in org_input
            # 而且其出现的次数和元素列表中出现的次数一致
            # 这可保证输入列表中的数据不会丢失
            assert output.count(val) == org_input.count(val)
            # 保证有序,从小到大
            assert val 

可以发现测试代码的长度比被测代码的长度还要长,这是软件测试中,尤其是功能测试部分常见的现象。另外一个现象是对于针对特殊使用场景的测试用例数量比较大。多数情况下,问题不会隐藏在常用的使用场景,而多隐藏在这些不常见的使用场景中,所以针对这些特殊使用场景的测试用例的设计需要多下功夫。

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 怎么编辑短信(手机编辑短信在那里发送)

    昨天,#中国移动被诉乱扣费#话题登上热搜,引发了广大网友的热议。 教授了解到,原来是最近有一位中国移动用户发起了投诉,表示自己在手机流量还剩1G左右、只用手机重复听同一首歌的情况下…

    2022年4月18日 专栏投稿
  • 米怎么保存(大米沾水了还能保存吗)

    大米如何存放?教你四个小妙招 哈喽,大家好,今天给大家分享的生活美食小妙招是如何更好地储存大米。最近气温越来越高,几乎每个人都在烦恼着,家里的大米实在是太多了,去年老妈在家就是因为…

    2022年4月18日 专栏投稿
  • 孕妇怎么补(孕妇怎么补充每天的营养)

    都知道孕期需要丰富的营养,但是因为孕妈自制力的问题,或者因为没有经验,在宝宝快速发育的阶段,没有补充足够的相关营养,导致胎儿发育并不理想,这是事实存在的,也间接造成了宝宝后天的某些…

    2022年5月9日 专栏投稿
  • 贵州有多少(河南穷还是贵州穷)

    时至今日,很多人对贵州的印象,依旧是司马迁和柳宗元给出的评价。 有些人还以为在贵州花溪上下学的学生娃儿们是这样的情况:划船走花溪河,校服穿的是印江蜡染兰花棉T恤,脚底统一麻绳大草鞋…

    2022年5月26日
  • 现在的奶粉还含有三聚氰胺吗(麦当劳经典案例)

    2009年3月12日,三鹿董事长田文华被法院判决无期徒刑。 大众本以为,她这辈子将会在监狱中面壁思过。但2年后,因田文华表现良好,获得减刑机会,从无期到减至19年。 这之后,田文华…

    2022年6月23日 专栏投稿
  • sql语句获取当前时间的函数(sql查询语句大全及实例)

    今天是SQL知识大全的第五讲,主要内容是和时间函数相关,主要包括了常用的时间函数,时间提取函数,时间计算函数以及时间和时间戳之间的转换。 常用的时间函数 to_date()函数 t…

    2022年6月26日
  • 多肉怎么浇水(多肉植物的浇水方法说明)

    学会给多肉浇水,预防根系腐烂,浇水看似简单,实际上有讲究 多肉浇水是整个养护期间必不可少的一步,合理的浇水方式可以让多肉更好的生长,甚至还可以杜绝多肉的根系腐烂,养多肉,最怕的就是…

    2022年4月5日 专栏投稿
  • 怎么查老公删除的微信聊天记录(今日详细介绍)

    1、如何查看老公删除的微信聊天记录:如何查看微信删除的聊天记录 微信删除聊天后查找聊天记录的方法如下: 准备材料:微信APP , 智能手机 1、打开微信,点击你要查找聊天记录的好友…

    2022年5月23日
  • 一个人怎么过(单身一个人怎么过好一生)

    人到老年,单身一人应该怎样度过余下的时光呢?   邻居王大妈,今年58岁,老公三年前去世。她有一个独生儿子。   这儿子,出国留学,并在国外成家立业啦!对于母亲,从来都没有说过怎么…

    2022年5月2日
  • 地毯怎么清洗(水晶绒地毯怎么清洗)

    各种地面污渍已经成为家庭生活的一部分,有小朋友的家庭更是不可避免,而地毯的地方如果脏了会特别难以清洗,下面介绍四个方法,轻松帮你搞定各种地毯污渍。 一、地毯干洗法 我们可以先用吸尘…

    2022年5月1日 专栏投稿
品牌推广 在线咨询
返回顶部