python单元测试框架——unittest笔记

1.测试金字塔模型

2.自动化测试用例编写

 3.Unittest各个组件的介绍

 4.测试固件

在unittest中测试固件依据⽅法可以分为两种执⾏⽅式,⼀种是测试固件只执⾏⼀次,另外⼀种是测试固件每次都执⾏

(1)测试固件每次都执行

import unittest
from selenium import webdriver

class TestUi(unittest.TestCase):
    def setUp(self) -> None:
        print('开始执行')

    def tearDown(self) -> None:
        print('执行结束')

    def test_001(self):
        pass

    def test_002(self):
        pass

(2)测试固件只执行一次

import unittest
from selenium import webdriver

class TestUi(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('开始执行')
@classmethod
def tearDownClass(cls) -> None: print('执行结束') def test_001(self): pass def test_002(self): pass

5.测试用例执行顺序

import unittest
class Api(unittest.TestCase):
 def test_001(self):
 pass

 def test_002(self):
 pass
if __name__ == '__main__':
 unittest.main(verbosity=2)

6.verbosity的详解(unittest实战)

在unittest中,执⾏的时候默认是1,也就是unittest.main(verbosity=1),在verbosity有三个参数,分别是0,1,2,代表的意思具体如下:
0(静默模式):仅仅获取总的测试⽤例数以及总的结果
1(默认模式):可以控制输出的错误报告的详细程度
2(详细模式):测试结果会显示每个测试⽤例的所有相关信息
from selenium import webdriver
import unittest
import time as t
class TestSina(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        '''初始化'''
        cls.driver=webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.get('https://mail.sina.com.cn/')
        cls.driver.implicitly_wait(30)
    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_sina_001(self):
        isLogin=self.driver.find_element_by_id('store1')
        self.assertEqual(isLogin.is_selected(),True)
    #帐户和密码为空
    def test_sina_002(self):
        self.driver.find_element_by_link_text('登录').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,'请输入邮箱名')
    # 注册
    def test_sina_003(self):
        nowHandler = self.driver.current_window_handle
        self.driver.find_element_by_link_text('注册')
        allHandlers = self.driver.window_handles
        for handler in allHandlers:
            if nowHandler != handler:
                self.driver.switch_to.window(handler)
                self.assertEqual(self.driver.current_url, 'https://mail.sina.com.cn/register/regmail.php')
                self.driver.close()
                self.driver.switch_to.window(nowHandler)
    #密码为空
    def test_sina_004(self):
        self.driver.find_element_by_id('freename').send_keys('liuxun0223@sina.com')
        self.driver.find_element_by_link_text('登录').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')
        self.assertEqual(divText.text,'请输入密码')

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

7.编写测试用例注意事项

(1)在⼀个测试类⾥⾯,每⼀个测试⽅法都是以test开头的,test不能是中间或者尾部,必须是开头,建议test_
(2)每⼀个测试⽤例⽅法都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点
(3)在⾃动化测试中,每个测试⽤例都必须得有断⾔,⽆断⾔的⾃动化测试⽤例是⽆效的
(4)最好⼀个测试⽤例⽅法对应⼀个业务测试点,不要多个业务检查点写⼀个测试⽤例
(5)如果涉及到业务逻辑的处理,最好把业务逻辑的处理⽅法放在断⾔前⾯,这样做的⽬的是不要因为业务逻辑执⾏错误导致断⾔也是失败
(6)测试⽤例名称最好规范,有约束
(7)是否先写⾃动化测试的测试代码,在使⽤⾃动化测试⽅式写,本⼈觉得没必要,毕竟能够做⾃动化测试的都具备了功能测试的基本⽔平,所以没必要把⼀个业务的检查点写多次,浪费时间和⼈⼒成本。
8.测试分离
from selenium import webdriver
import unittest
import time as t

class Init(unittest.TestCase):
    def setUp(self) -> None:
        '''初始化'''
        self.driver=webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()

class TestSina(Init):
    def test_sina_001(self):
        isLogin=self.driver.find_element_by_id('store1')
        self.assertEqual(isLogin.is_selected(),True)
    #帐户和密码为空
    def test_sina_002(self):
        self.driver.find_element_by_link_text('登录').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,'请输入邮箱名')
    # 注册
    def test_sina_003(self):
        nowHandler = self.driver.current_window_handle
        self.driver.find_element_by_link_text('注册')
        allHandlers = self.driver.window_handles
        for handler in allHandlers:
            if nowHandler != handler:
                self.driver.switch_to.window(handler)
                self.assertEqual(self.driver.current_url, 'https://mail.sina.com.cn/register/regmail.php')
                self.driver.close()
                self.driver.switch_to.window(nowHandler)
    #密码为空
    def test_sina_004(self):
        self.driver.find_element_by_id('freename').send_keys('liuxun0223@sina.com')
        self.driver.find_element_by_link_text('登录').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')
        self.assertEqual(divText.text,'请输入密码')

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

9.parameterized实战

安装命令:pip3 install parameterized

import unittest
from parameterized import parameterized,param

def add(a,b):
    return a+b

class AddTest(unittest.TestCase):
    def setUp(self) -> None:
        pass

    def tearDown(self) -> None:
        pass

    @parameterized.expand([
        param(1,1,2),
        param(2,2,4),
        param('hello',' world','hello world')
    ])
    def test_add(self,a,b,result):
        self.assertEqual(add(a,b),result)

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

10.unitest模块

(1)TestCase():对特定类进行测试的集合(多以test_开头)

(2)setUp():用于测试用例执行前的初始化工作(测试前准备环境的搭建)

(3)tearDown():与setUp()方法相呼应,用于测试用例执行后的结束工作(测试后环境的还原)

(4)main():可以方便的将一个单元测试模块变成可以直接运行的测试脚本

11.测试套件:测试用例的集合

12.unittest的断言

import unittest
from parameterized import parameterized,param
from selenium import webdriver
import time as t

class UiTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://mail.sina.com.cn/#')
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()

    @parameterized.expand([
        param('','','请输入邮箱名'),
        param('liuxun@sina.com','liuxun0223','登录名或密码错误'),
        param('liuxun','liuxun0223','您输入的邮箱名格式不正确')
    ])
    def test_sina_login(self,username,password,divText):
        self.driver.find_element_by_id('freename').send_keys(username)
        self.driver.find_element_by_id('freepassword').send_keys(password)
        self.driver.find_element_by_link_text('登录').click()
        t.sleep(3)
        erorText1=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        #断言:assertEqual(),在值的数据类型和内容相等的情况下,判断两个值是否相等
self.assertEqual(erorText1.text,divText)
if __name__ == '__main__': unittest.main(verbosity=2)
posted @ 2021-08-18 17:34  liuxun0223  阅读(54)  评论(0)    收藏  举报