• 自动化测试:电商管理系统元素定位练习


    本次专题我们来说一下 Python中Unittest 框架的使用及如何通过HTMLTestRunner实现自动化测试报告的自动生成。案例中的代码我们仍旧使用课堂学习中部署的“电商管理系统”来实现。本次练习包括以下几个操作:

    l 测试用例整体结构设计

    l 测试用例的实现

    l 测试套的组织及测试报告的生成

    1. 测试用例整体结构设计

    Unittest原名为PyUnit,是由java的JUnit衍生而来,用于编写和运行可重复的测试。基于断言机制来判断函数或方法的实际输出结果和期望输出结果是否一致,测试用例提供参数来执行函数或方法,获取它们的执行结果,然后使用断言方法来判断该函数或方法的输出结果与期望输出结果是否一致,如果一致则说明测试通过;如果不一致则说明测试不通过。

    Unittest 要求单元测试类必须继承 TestCase,该类中的测试方法应以test开头,没有参数和返回值。另外可以通过在单元测试中增加两个特殊函数setUp()和tearDown()函数,用于实现在每调用一个测试方法的前后分别执行指定的动作,其中setUp是在测试函数调用前执行,tearDown是在之后执行。

    我们首先为登录功能编写一个测试用例,代码结构如下,一共演示包括三个测试方法:
    在这里插入图片描述
    2. 测试用例的实现

    接下来我们完成测试用例内容的实现。按照上面的结构,一共实现两个测试用例,一个登录的测试用例,一个增加商品类型的测试用例。

    登录测试用例。这里将系统登录页面的打开和关闭功能分别封装进setUp和tearDown函数内部,这样后续每个方法执行的前后会自动打开登录页面并在测试执行之后关闭登录页面。

    代码实现如下:

    import unittest
    from time import sleep
    from selenium import webdriver
    
    
    # 登录测试用例
    class LoginTest(unittest.TestCase):
     # 每执行一个测试方法前,先打开登录页面
     def setUp(self):
     self.driver = webdriver.Firefox()
     self.driver.implicitly_wait(10)
     self.driver.get('http://39.96.181.61/qftest-ds/index.php?m=backend&c=main&a=index')
    
     # 每执行一个测试方法后,关闭浏览器
     def tearDown(self):
     self.driver.quit()
    
     # 测试方法1:无效用户名登录测试
     def test_01_invalid_username(self):
     self.driver.find_element_by_id("username").send_keys('abcdefg')
     self.driver.find_element_by_id("password").send_keys('qftestxxxxx')
     self.driver.find_element_by_link_text('登 陆').click()
            sleep(2)
     # 断言:如果登录失败,应该显示提示信息,包含文字:"错误的用户名或密码"
     self.assertIn('错误的用户名或密码', self.driver.page_source)
    
     # 测试方法2:无效密码登录测试
     def test_02_invalid_password(self):
     self.driver.find_element_by_id("username").send_keys('admin')
     self.driver.find_element_by_id("password").send_keys('123456')
     self.driver.find_element_by_link_text('登 陆').click()
            sleep(2)
     # 断言:如果登录失败,应该显示提示信息,包含文字:"错误的用户名或密码"
     self.assertIn('错误的用户名或密码', self.driver.page_source)
    
     # 测试方法3:有效用户名和密码登录测试
     def test_03_valid(self):
     self.driver.find_element_by_id("username").send_keys('admin')
     self.driver.find_element_by_id("password").send_keys('qftestxxxxxx')
     self.driver.find_element_by_link_text('登 陆').click()
            sleep(2)
     # 断言:如果登录成功,应该进入系统桌面,包含文字:"常用菜单"
     self.assertIn('常用菜单', self.driver.page_source)
    
    
    if __name__ == "__main__":
        unittest.main()
    
    增加商品类型测试用例。这里将系统登录和退出及关闭浏览器功能分别封装进setUp和tearDown函数内部,这样后续每个方法执行的前后会自动完成登录并在测试执行之后退出和关闭登录页面。
    代码实现如下:
    import random
    import unittest
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    
    
    # 增加商品分类测试用例
    class AddTypeTest(unittest.TestCase):
    
     def setUp(self):
     self.driver = webdriver.Firefox()
     self.driver.implicitly_wait(10)
     self.driver.get('http://39.96.181.61/qftest-ds/index.php?m=backend&c=main&a=index')
     self.driver.find_element_by_id("username").send_keys('admin')
     self.driver.find_element_by_id("password").send_keys('qftestxxxxxxx')
     self.driver.find_element_by_link_text('登 陆').click()
            sleep(3)
    
     def tearDown(self):
     self.driver.switch_to.default_content()
     self.driver.find_element_by_link_text("退出登录").click()
            sleep(2)
     self.driver.quit()
    
     # 测试方法1:是否可要正确打开商品分类页面
     def test_01_open_type(self):
            sleep(5)
     # 依次点击目录:商品管理 - 商品分类
     self.driver.find_element_by_xpath('/html/body/div[5]/div[1]/div[2]/h3/a').click()
     self.driver.find_element_by_partial_link_text('商品分类').click()
            sleep(5)
     # 切换到内部 iframe
     self.driver.switch_to.frame('main')
     # 断言:如果打开商品分类页面成功,应该包含显示文字:"分类名称"
     self.assertIn('分类名称', self.driver.page_source)
    
     # 测试方法2:是否可要新增商品分类,并且添加成功
     def test_02_add_type(self):
            sleep(5)
     # 依次点击目录:商品管理 - 商品分类
     self.driver.find_element_by_xpath('/html/body/div[5]/div[1]/div[2]/h3/a').click()
     self.driver.find_element_by_partial_link_text('商品分类').click()
            sleep(5)
     self.driver.switch_to.frame('main')
     # 点击“新增分类”按钮
     self.driver.find_element_by_xpath('/html/body/div/div[2]/div[1]/a[1]/font').click()
            sleep(1)
    
     # 输入分类名称
     self.driver.find_element_by_id('cate_name').send_keys('奥里给')
            sleep(1)
    
     # 从下拉列表中随机选择一个上级分类
     father_type = self.driver.find_element_by_id('parent_id')
            father_type_opts = Select(father_type).options
            rom = random.randint(0, len(father_type_opts) - 1)
            Select(father_type).select_by_index(rom)
            sleep(1)
    
     # 点击“保存并提交”按钮
     self.driver.find_element_by_css_selector('html body div.content form div.box div.submitbtn button.ubtn.btn').click()
            sleep(5)
    
     # 断言:新增的分类名称,应该显示在返回的分类表格页面中
     self.assertIn('奥里给', self.driver.page_source)
    
    
    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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120

    3. 测试套的组织及测试报告的生成

    对于测试用例的执行,我们使用unittest下面的测试套件类TestSuite,从它的类定义来看,可以理解为多个独立的测试用例(test case)可以构成一个测试套件。

    想让测试用例按顺序执行,要用到TestSuite类的addTest方法。调用addTest方法后,先添加的先执行,后添加的后执行。但是这里提请大家注意一下,在PyCharm中,addTest方法并没有起到作用,原因是在PyCharm中,引入了unittest模块,会默认按照unittest模式执行,此时需要将unittest模式转换成普通模式。

    我们在做自动化测试的时候,希望能生一张漂亮的测试报告来展示用例执行的结果,这里我们使用HTMLTestRunner来实现。HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展。它生成易于使用的 HTML 测试报告。

    代码实现如下:

    import unittest
    from HTMLTestRunner import HTMLTestRunner
    from F01_login_test import LoginTest
    from F02_add_type_test import AddTypeTest
    
    
    # 定义测试套(包含要运行的测试用例及方法)
    def test_suite():
        suite = unittest.TestSuite()
    
        # 添加第一个测试用例及所属测试方法
        suite.addTest(LoginTest('test_01_invalid_username'))
        suite.addTest(LoginTest('test_02_invalid_password'))
        suite.addTest(LoginTest('test_03_valid'))
    
        # 添加第二个测试用例及所属方法
        suite.addTest(AddTypeTest('test_01_open_type'))
        suite.addTest(AddTypeTest('test_02_add_type'))
    
        return suite
    
    
    if __name__ == '__main__':
        # 设置测试报告输出文件
        with open('./test_report.html', 'wb') as f:
            runner = HTMLTestRunner(stream=f,
                                    title="自动化测试报告",
                                    description="电商系统自动化测试报告")
            # 运行测试套
            runner.run(test_suite())
    
    • 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

    最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

    在这里插入图片描述

    这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

    如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

    敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

    自学推荐B站视频:

    零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

    自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

    在这里插入图片描述

  • 相关阅读:
    三数之和[中等]
    【UI测试】内容及流程
    关于白盒测试,这些技巧你得游刃有余~
    Java入门教程(14) ——Scanner 获取键盘输入
    【深入解析spring cloud gateway】08 Reactor 知识扫盲
    MySQL主从复制与读写分离
    1162 Postfix Expression – PAT甲级真题
    MATLAB SAC算法reward震荡问题
    【原创】EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等操作系统指南
    redis key的删除淘汰策略
  • 原文地址:https://blog.csdn.net/weixin_57805858/article/details/126643397