UI自动化——单元测试框架(1)
一、自动化测试概述
1、自动化测试维度
1)表单的错误提示信息的验证(如弹出框文本信息的验证,邮箱等输入的格式不规范。)
2)产品业务逻辑的验证;
3)页面的各种交互。
2、自动化测试步骤
1)先梳理哪些模块可以做自动化测试。
2)梳理完成后,和相关的人建议对下计划以及梳理的结果。
3)编写代码实现梳理的测试模块。
4)编写完成后,和相关的人进行评审代码(测试场景是否考虑周全,测试断言是否合理,代码编写的是否合理)。
5)编写完成后,整合到Jekins的持续集成平台。
6)下个迭代的时候,直接可以应用于产品的回归测试中。
3、自动化测试用例组成
1)初始化:setUp
2)测试步骤:test_字符
3)断言:assert
4)清理:tearDown
二、断言的方式
1、python原生的assert断言
import unittest
from selenium import webdriver
#初始化
#关键字:setUp
class BaiduTest(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('http://www.baidu.com')
self.driver.implicitly_wait(30)
#清除
#关键字:tearDown
def tearDown(self) -> None:
self.driver.quit()
#测试方法(断言)
#在测试类里面编写的测试方法必须是test开头的
def test_baidu_title(self):
assert self.driver.title=='百度一下,你就知道'
#执行
if __name__=='__main__':
unittest.main
2、selenium原生的断言
1)saaertEqual:比较两个对象是否相等
import unittest
from selenium import webdriver
import time as t
class SinaTest(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_login_null(self):
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=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(divTest.text,'您输入的邮箱名格式不正确')
def test_login_email_format(self):
self.driver.find_element_by_id('freename').send_keys('werwf')
self.driver.find_element_by_id('freepassword').send_keys('AFsfeasf')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=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(divTest.text,'您输入的邮箱名格式不正确')
if __name__=='__main__':
unittest.main()
2)assertIN:比较一个对象是否包含另一个对象
import unittest
from selenium import webdriver
import time as t
class SinaTest(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_login_null(self):
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=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(divTest.text,'请输入邮箱名')
def test_login_email_format(self):
self.driver.find_element_by_id('freename').send_keys('werwf')
self.driver.find_element_by_id('freepassword').send_keys('AFsfeasf')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=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]')
#assertIn:比较一个对象是否包含另一个对象
self.assertIn(divTest.text,'您输入的邮箱名格式不正确')
def test_login_isButton(self):
divText=self.driver.find_element_by_id('store1')
t.sleep(3)
#针对bool的类型验证assertTrue
self.assertTrue(divText.is_selected())
divText.click()
t.sleep(3)
#针对bool的类型验证assertFalse
self.assertFalse(divText.is_selected())
if __name__=='__main__':
unittest.main()
3)assertTrue与assertFalse
assertTrue:针对bool类型验证true or false;真真为真,真假为假,即断言内容返回真,则为真,断言内容返回假则为假
assertFalse:针对bool类型验证true or false;假假为真,假真为假,即断言内容返回假,则为真,断言内容返回真则为假
import unittest
from selenium import webdriver
import time as t
class SinaTest(unittest.TestCase):
@classmethod
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)
@classmethod
def tearDown(self) -> None:
self.driver.quit()
def test_login_null(self):
self.driver.find_element_by_id('freename').send_keys('')
self.driver.find_element_by_id('freepassword').send_keys('')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=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(divTest.text,'请输入邮箱名')
def test_login_email_format(self):
self.driver.find_element_by_id('freename').send_keys('werwf')
self.driver.find_element_by_id('freepassword').send_keys('AFsfeasf')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divTest=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(divTest.text,'您输入的邮箱名格式不正确')
#assertIn:比较一个对象是否包含另一个对象
self.assertIn(divTest.text,'您输入的邮箱名格式不正确')
def test_login_isButton(self):
divText=self.driver.find_element_by_id('store1')
t.sleep(3)
#针对bool的类型验证assertTrue
self.assertTrue(divText.is_selected())
divText.click()
t.sleep(3)
#针对bool的类型验证assertFalse
self.assertFalse(divText.is_selected())
if __name__=='__main__':
# #按测试类来执行
# suite=unittest.TestLoader().loadTestsFromTestCase(testCaseClass='SinaTest')
#按测试模块来执行
suite=unittest.TestLoader().loadTestsFromModule(module='test_sina.py')
unittest.TextTestRunner().run(suite)
三、单元测试
在python中,单元测试的框架主要就是unittest。
unittest属于标准库,只要安装了python解释器后就可以直接导入使用了。
导入的方式为:import unittest。
自动化测试的方法是由unittest库下的TestCase类提供的,所以我们写自动化测试用例前必须继承unittest库中的TestCase类
四、unittest测试框架
注意事项:
1、在测试类里面编写的测试方法必须是test开头的,也就是测试的步骤和断言部分的方法名,必须以test开头,推荐使用test_,并且一言以蔽之,如测试百度的标题名的测试用例,其方法名为:test_baidu_title(self)。
2、在测试类中,若使用的是常规的测试固件,那么有多少个测试用例,其里面的初始化和清理就执行多少次。
3、如果在测试类中,有很多个测试用例,而我们仅仅想执行某一个测试用例,那么就将鼠标放在该测试用例的名称处,然后运行即可。