unittest(1)
unittest单元测试框架
一、测试金字塔模型
UI层:可以理解为功能测试;
service:接口测试(API);
Unit(单元测试)。

**二、白盒测试**
在软件架构,测试最核心的步骤是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们称为白盒测试。
在自动化测试过程中,编写的每一个测试用例都是需要借助单元测试框架的,在Python技术栈中,单元测试框架主要是unittest和Pytest,Java技术栈里面主要使用的是junit和testng。

三、单元测试步骤:
设置:(初始化获取浏览器驱动对象driver,打开网页、最大化浏览器、隐式等待)
测试:步骤
断言: 验证 assert
清理:(关闭浏览器)
unittest是单元测试框架,使用它的注意事项:
1、测试类以Test开头 2、每个测试类必须要继承unittest模块中的TestCase类,这样就可以直接调用里面的方法 3、在测试类里面编写的方法叫测试方法,测试方法必须是以test开头的
所有的测试用例都必须在test包下,每个测试模块都应该是以test_模块名称来命名 每个测试类都建议Test开头,每个测试方法必须是以test开头
举例:
class TestAdd(unittest.TestCase): # TestAdd是类,类继承unittest下的TestCase def test_add_int(self): assert add(5,6)==11 if __name__==" main ": # 执行全部 验证 unittest.main()

四、单元测试框架包括

测试用例(TestCase):就是测试类里面编写的测试方法
测试固件:初始化setUp(),清理tearDown()
测试套件(TestSuite):测试用例的集合,在一个测试套件可以有很多的测试用例
测试执行(TestRunner):执行测试套件或者测试用例
测试报告(TestReport):就是执行所有测试用例后的结果信息
五、断言
以百度为例
class TestBaidu(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get("https://www.baidu.com") self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit() def test_baidu_title(self): assert self.driver.title == "百度一下,你就知道" def test_baidu_url(self): assert self.driver.current_url=="https://www.baidu.com" def test_baidu_so(self): so=self.driver.find_element(By.ID,"kw") so.send_keys("奋斗史") assert so.get_attribute("value")=="奋斗史" if __name__ == '__main__': unittest.main()

六、测试固件
assertEqual():比较两个对象的==关系 assertIn():比较两个对象的包含关系 assertIs():比较两个字符串的内存地址
以百度为例
class TestBaidu(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get("https://www.baidu.com/") self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit() def test_baidu_title(self): assert self.driver.title == "百度一下,你就知道" def test_baidu_url(self): assert self.driver.current_url=="https://www.baidu.com/" def test_baidu_so(self): so=self.driver.find_element(By.ID,"kw") so.send_keys("奋斗史") self.assertEqual(so.get_attribute("value"),"奋斗史") def test_baidu_enble(self): so=self.driver.find_element(By.ID,"kw") self.assertTrue(so.is_enabled()) def test_baidu_enble(self): so=self.driver.find_element(By.LINK_TEXT,"关于百度") self.assertTrue(so.is_displayed()) if __name__=="main": unittest.main()

测试固件:
1、setUp() and tearDown():在一个测试类里面,有多少个测试用例,它就会被执行多少次 2、setUpClass() and tearDownClass():是类方法,不管测试类里面有多少测试用例,它只会执行一次
以新浪邮箱为例,登录错误信息验证
import time as t class TestSina(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() def test_username_null(self): '''验证空名''' self.driver.find_element(By.LINK_TEXT,"登录").click() 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_email_format(self): '''验证输入格式不正确''' self.driver.find_element(By.ID,"freename").send_keys("hjk") self.driver.find_element(By.ID,"freepassword").send_keys("hjkl") self.driver.find_element(By.LINK_TEXT,"登录").click() 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_username_passwd_error(self): '''验证登录密码错误''' self.driver.find_element(By.ID,"freename").send_keys("hjk@sina.com") self.driver.find_element(By.ID,"freepassword").send_keys("hjkl123") self.driver.find_element(By.LINK_TEXT,"登录").click() t.sleep(2) ddText=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(ddText.text,"登录名或密码错误") if __name__ == '__main__': unittest.main()

from selenium import webdriver import time as t from selenium.webdriver.common.by import By from parameterized import parameterized,param import unittest class TestSina(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("asf", "tgfrds", "您输入的邮箱名格式不正确"), param("as2t@sina.com", "hgfd", "登录名或密码错误") ]) def test_username_passwd_error(self,username,password,result): 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) ddText=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]") print(ddText.text) self.assertEqual(ddText.text,result) if __name__ == '__main__': unittest.main()

八、测试套件
测试执行原则:自动寻找到被执行的测试模块,根据测试模块寻找到测试类中符合要求的测试方法来进行执行
import unittest import os def allTest(): suite=unittest.TestLoader().discover( # start_dir 测试模块的路径 start_dir=os.path.dirname(__file__), # pattern 通过正则方式加载所有的测试模块 pattern="test_*.py") return suite

九、测试报告
unittest生成测试报告需要借助第三方的库HtmlTestRunner.py的文件助第三方的库parameterized




浙公网安备 33010602011771号