菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
17
0

Unittest自动化测试框架

原创
05/13 14:22
阅读数 85506


(1)Unittest框架设计思路

  1. case:测试用例。
  2. public:将一些公共的业务封装成类和方法。
  3. report:测试报告。
  4. testrunner:批量运行。

(2)setUp、tearDown、测试函数

  • setUp()方法,初始化,最先执行,比如:每次都会打开浏览器,打印开始执行测试的时间。
  • tearDown()方法,最后执行,比如:每次执行完成都会截图,打印执行结束的时间。
  • 测试函数 ,第二执行,函数名必须以test开头。
from selenium import webdriver
import unittest
import os
import time
from public.wukong_crm.login import Login


class TestIndex(unittest.TestCase):
    def setUp(self):
        """ setUp方法,初始化 最先执行,每次都会打开页面 """
        self.driver = webdriver.Chrome()
        # 打开悟空CRM系统
        self.driver.get("http://[服务器ip]:8088/")
        self.driver.maximize_window()
        time.sleep(3)

        # 打印用例开始执行的时间
        print("start_time:" + time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))

    def tearDown(self):
        """  最后执行,每次执行完成都会截图 """
        file_dir = "D:/Desktop/Testman_Study/图库/screen/"
        # 如果找不到文件夹,则新建一个文件夹
        if not os.path.exists(file_dir):
            os.makedirs(os.path.join("D:/", "Desktop", "Testman_Study", "图库", "screen"))
        # 打印执行完成的时间
        print("end_time:" + time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))
        # 截图命名以时间戳命名
        screen_name = file_dir + time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())) + ".png"
        self.driver.get_screenshot_as_file(screen_name)
        self.driver.quit()

    def testIndex01_01(self):
        """WKCRM_001. 验证导航文案是否显示正常"""
        # 调用login方法,登录悟空CRM系统
        Login(self.driver).login()
        
        # 获取导航栏各个控件的文本信息
        # 办公
        text_bg = self.driver.find_element_by_xpath('//a[@class="nav-item router-link-active"]/div').text
        # 客户管理
        text_khgl = self.driver.find_element_by_xpath('//*[@id="app"]/section/header/div/div/div/a[2]/div').text
        # 商业智能
        text_syzn = self.driver.find_element_by_xpath('//*[@id="app"]/section/header/div/div/div/a[3]/div').text
        # 项目管理
        text_xmgl = self.driver.find_element_by_xpath('//*[@id="app"]/section/header/div/div/div/a[4]/div').text
        # 开通授权
        text_ktsq = self.driver.find_element_by_xpath('//*[@id="app"]/section/header/div/span[1]/button').text
        # 带有用户名的头像
        text_tx = self.driver.find_element_by_xpath(
            '//*[@id="app"]/section/header/div/span[2]/div[2]/div/div/div/div').text
        # 断言结果,进行文本信息的比对
        self.assertEqual('办公', text_bg)
        self.assertEqual('客户管理', text_khgl)
        self.assertEqual('商业智能', text_syzn)
        self.assertEqual('项目管理', text_xmgl)
        self.assertEqual('开通授权', text_ktsq)
        self.assertEqual('hs', text_tx)
        
if __name__ == "__main__":
    unittest.main()

(3)断言机制、常用断言方法

        # 断言方法一:
        # assertEqual、assertNotEqual
        # 表示相等
        self.assertEqual('办公', text_bg)
        self.assertNotEqual("办公管理", text_bg)

        # 断言方法二:
        # assertIn、assertNotIn
        # 表示包含,类似于模糊查询
        self.assertIn("开通", text_ktsq)

        # 断言方法三:
        # assertTrue、assertFalse
        # bool值
        self.assertTrue(
            self.driver.find_element_by_xpath('//a[@class="nav-item router-link-active"]/div').is_displayed())
        self.assertFalse(
            self.driver.find_element_by_xpath('//a[@class="nav-item router-link-active"]/div').is_displayed())

        # 断言方法四:
        # 设置一个不存在的控件,找不到就会报错,强制中断
        if username.text == "":
            print("不等于")
        else:
            print("不等于")
            self.driver.find_element_by_id("蔡坨坨")

(4)批量执行自动化测试用例、html美化报告生成

testrunner.py

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/16 22:41

import unittest
import time
import os
import sys
from report import HTMLTestRunner

# 获取当前.py文件的绝对路径,并进行路径分割
# dir_name:目录路径
# file_name:文件名称
dir_name, file_name = os.path.split(os.path.abspath(sys.argv[0]))
print(dir_name, file_name)
# 测试用例路径
case_path = ".\\case\\web\\wukong_crm\\"
# 测试报告路径
result = dir_name + "\\report\\"

def create_suite():
    """  定义单元测试容器 """
    test_unit = unittest.TestSuite()  # TestSuite() 测试套件

    # 定义搜索用例文件的方法
    # 比如:web/yunshang下的所有.py文件
    discover = unittest.defaultTestLoader.discover(case_path, pattern="*.py", top_level_dir=None)
    # 将测试用例加入测试容器中
    for test_suite in discover:
        for case_name in test_suite:
            test_unit.addTest(case_name)
    return test_unit

# 调用create_suite()方法
test_case = create_suite()
# 获取系统当前时间
now_time = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))
day = time.strftime('%Y-%m-%d', time.localtime(time.time()))
# 定义测试报告路径
result_dir = result + day

def report():
    """定义一个测试报告生成方法"""
    file_name = result_dir + "\\" + now_time + "_result.html"
    fp = open(file_name, 'wb')
    # 定义测试报告
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="测试报告", description="执行情况")
    # 执行测试用例
    runner.run(test_case)
    # 关闭报告文件
    fp.close()

# 检验文件夹路径是否存在
if os.path.exists(result_dir):
    # 调用report()方法
    report()
else:
    # 创建测试报告文件夹
    os.mkdir(result_dir)
    report()

HTMLTestRunner.py美化html测试报告

(5)CRM项目自动化测试

. 代表通过

F 代表未通过

E 表示程序错误

unittest框架总结

  1. 测试类必须继承unittest.TestCase。
  2. 测试函数必须以test开头。
  3. 测试类必须有unittest.main()方法。

发表评论

0/200
17 点赞
0 评论
收藏