基于unittest的单元测试

一、什么是单元测试unittest

- 1.单元测试:
	- 是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判断其具体含义,如C语言中单元指一个函数
		function add(int a,int b){}
		Java里单元是指一个类,图形化的软件中可以指一个窗口或一个菜单
	- 总的来说 ,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试
- 2.unittest 框架是 python的单元测试框架
	- 官网:https://docs.python.org/2/library/unittest.html
- 3.unitest = TestCase + TestResult 执行 + 结果 

二、单元测试框架unittest入门

- 1.用import引入unittest模块
- 2.测试的类都继承于TestCase类
- 3.setUp() 测试前的初始化工作;tearDown() 测试后的清除工作 (在每个测试方法运行时被调用)
- 注意:
	- 1.所有类中方法的入参为self,定义方法的变量也要 self.变量
	- 2.定义测试用例,以“test”开头命名的方法,方法的入参为self
	- 3.unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们
	- 4.自己写的py文件不能用unittest.py命名,不然会找不到TestCase
	- 成功是输出.,失败是F

三、测试套件TestSuite介绍

- 需求:
	- 1.利用unittest执行流程测试而非单元测试
	- 2.控制unittest的执行顺序
- 1、unittest.TestSuite() 类来表示一个测试用例集
	- 1)用来确定测试用例的顺序,哪个先执行,哪个后执行
	- 2)如果一个class中有四个test开头的方法,则加载到suite中时则有四个测试用例
	- 3)由TestLoder加载TestCase到TestSuite
	- 4)verbosity参数可以控制执行结果的输出,0 是简单的报告;1 是一般报告;2 是详细报告
		默认是1 会在每个成功的用例前面有个“.”,每个失败的用例前面有个“F”
- 2、TextTestRunner() 文本测试用例运行器
- 3、run() 方法试运行测试套件的测试用例,入参为suite测试套件 

测试套件TestSuite生成测试报告

- 1.HTMLTestRunner介绍
	- 1.HTMLTestRunner是python标准库的unittest模块的一个扩展,它可以生成HTML的测试报告,无法通过pip安装。首先要下载HTMLTestRunner.py文件,将下载的文件放入...\python\Lib目录下(或者同个路径)
	- 注意点:
		- python2和python3,语法不一样,导致HTMLTestRunner在python3不兼容
		- 解决办法:导入课程资料里修改好的HTMLTestRunner.py(修改版)

selenium和unittest整合项目实战

- 自动化测试的测试用例设计的一些方法
	- 解耦、可以独立运行、需要灵活切换
	- 设计思路:脚本功能分析(分步骤)和模块化分层(拆分为多模块)
	- 综合考虑整个项目的成本,只能去优先考虑需求变更少的、主要的功能去验证

案例参考

  • 主文件及测试用例文件均在一个directory
  • 主文件:all_test.py
  • 测试用例1:login_order.py
  • 测试用例2:creat_student_group.py
"""
主入口
"""
import time
import unittest
import HTMLTestRunner
from project_01 import creat_student_group, login_order


# 创建测试集
def creat_suite():
    print('测试开始')
    suite = unittest.TestSuite()
    # 登录
    suite.addTest(unittest.makeSuite(login_order.LoginTestCase))
    # 创建打分组
    suite.addTest(unittest.makeSuite(creat_student_group.CreatStudentGroupTestCase))
    return suite


if __name__ == '__main__':
    suite = creat_suite()
    file_time = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
    fp = open(f'F:/test/{file_time}_result.html', "wb")
    html_runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="测试报告", description="测试报告详情", verbosity=2)
    html_runner.run(suite)
    fp.close()
"""
登录测试用例
"""
from selenium import webdriver
import time
import unittest


class LoginTestCase(unittest.TestCase):
    def setUp(self):
        """测试开始"""
        print('测试开始')
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        self.base_url = "url"
        self.driver.get(self.base_url)

    def tearDown(self):
        """测试结束"""
        print('测试结束')

    def test_login(self):
        """登录验证"""
        driver = self.driver
        # 使用cookie跳过登录
        driver.add_cookie({"name": "xxx",
                           "value": "xxx"})
        # 刷新页面
        driver.refresh()
        user_name = driver.find_element_by_xpath(
            'xxx')
        self.assertEqual(user_name.text, 'xxx', msg='用户名不一致,失败')
        time.sleep(2)


if __name__ == '__main__':
    unittest.main()
"""
打分组创建测试用例
"""
from selenium import webdriver
import time
import unittest


class CreatStudentGroupTestCase(unittest.TestCase):
    def setUp(self):
        """测试开始"""
        print('测试开始')
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        self.base_url = "url"
        self.driver.get(self.base_url)
        # 使用cookie跳过登录
        self.driver.add_cookie({"name": "xxx",
                                "value": "xxx"})
        # 刷新页面
        self.driver.refresh()
        user_name = self.driver.find_element_by_xpath(
            'xxx')
        self.assertEqual(user_name.text, 'xxx', msg='用户名不一致,失败')
        time.sleep(2)

    def tearDown(self):
        """测试结束"""
        print('测试结束')

    def test_csg(self):
        """新建打分组"""
        driver = self.driver

        # 展开一级设置菜单
        driver.find_element_by_xpath(
            'xxx').click()
        # 选中二级打分组菜单,展开右侧子页面
        driver.find_element_by_xpath('xxx').click()
        # 点击新建
        driver.find_element_by_xpath(
            'xxx').click()
        # 输入打分组名称,并保存
        driver.find_element_by_xpath('//*[starts-with(@id,"_sf")]').send_keys("TestGroup")
        # 保存
        driver.find_element_by_xpath(
            'xxx').click()
        # 关闭添加成功提示框
        driver.find_element_by_xpath('xxx').click()


if __name__ == '__main__':
    unittest.main()

另一案例

# 测试文件
import unittest


class UserTestCase01(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('01---setup---class')

    @classmethod
    def tearDownClass(cls):
        print('01---teardown---class')

    def setUp(self):
        print('01---setup')

    def tearDown(self):
        print('01---teardown')

    def test_a_case01(self):
        print('01----------------a')

    @unittest.skip('跳过这一步')
    def test_b_case01(self):
        print('01----------------b')

    def test_c_case01(self):
        print('01----------------c')
        assert 0, '验证失败'


class UserTestCase02(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('02---setup---class')

    @classmethod
    def tearDownClass(cls):
        print('02---teardown---class')

    def setUp(self):
        print('02---setup')

    def tearDown(self):
        print('02---teardown')

    def test_a_case02(self):
        print('02----------------a')

    @unittest.skip('跳过这一步')
    def test_b_case02(self):
        print('02----------------b')

    def test_c_case02(self):
        print('02----------------c')
        assert 0, '验证失败'


if __name__ == '__main__':
    unittest.main()
# 执行文件
import unittest
import user_test_case


def runAllCase():
    suite = unittest.TestSuite()
    loader = unittest.TestLoader()  # 自动添加
    suite.addTests([loader.loadTestsFromTestCase(user_test_case.UserTestCase01),
                    loader.loadTestsFromTestCase(user_test_case.UserTestCase02)])
    return suite

if __name__ == '__main__':
    suite = runAllCase()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

加载指定路径下的全部测试用例

import unittest
import os


def load_all_case():
    """加载指定路径下的全部测试用例"""
    print(os.getcwd())  # 获取当前绝对路径
    case_path = os.path.join(os.getcwd(), 'case')  # 用当前绝对路径和case目录拼接
    print(case_path)
    discover = unittest.defaultTestLoader.discover(case_path, pattern='*case.py', top_level_dir=None)  # 加载目录下全部以case.py结尾的文件
    return discover


if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(load_all_case())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值