一、断言详解
(1)assertEqual()是验证两个?相等,值的是数据类型与内容也是相等的。
from selenium import webdriver import unittest class BaiduTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get(‘http://www.baidu.com‘) def tearDown(self) -> None: self.driver.quit() def test_baidu_title(self): # 验证百度的title是否是“百度一下,你就知道” self.assertEqual(self.driver.title,‘百度一下,你就知道‘) if __name__ == ‘__main__‘: unittest.main(verbosity=2)
(2)assertTrue返回的是bool类型,也就是对被测试的对象进?验证,如果返回的是boolean类型并且是true,那么结果验证通过,那么?法assertFlase()验证的是被测试对象返回的内容是false。
from selenium import webdriver import unittest class BaiduTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get(‘http://www.baidu.com‘) def tearDown(self) -> None: self.driver.quit() def test_baidu_so(self): # 验证百度搜索框是否可被编辑 so=self.driver.find_element_by_id(‘kw‘) # self.assertEqual(so.is_enabled(),True) self.assertTrue(so.is_enabled()) if __name__ == ‘__main__‘: unittest.main(verbosity=2)
(3)assertIn()值的是?个值是否包含在另外?个值??,在这?特别的强调?下,在assertIn()的?法??,有两个参数,那么值的包含其实就是第?个实际参数包含第?个实际参数。与之相反的?法是assergNotIn()
from selenium import webdriver import unittest class BaiduTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get(‘http://www.baidu.com‘) def tearDown(self) -> None: self.driver.quit() def test_baidu_in(self): # assertIn()值的是一个值是否包含在另外一个值里面 self.assertIn(‘百度一下‘, self.driver.title) if __name__ == ‘__main__‘: unittest.main(verbosity=2)
(4)断?中的注意事项
在?动化测试的应?中,测试的结果只有?个,那就是通过或者是不通过,不能存在可能通过或者可能不通过,测试结果必须是权威的,确定性的。
- 不正确的使?if应?
from selenium import webdriver import unittest class BaiduTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get(‘http://www.baidu.com‘) def tearDown(self) -> None: self.driver.quit() def test_baidu_if(self): title = self.driver.title if title == ‘百度一下,你就知道‘: print(‘测试通过‘) else: print(‘测试不通过‘) def test_baidu_try(self): # 不正确的断言,测试报告显示通过,但测试点实际上没有通过 title = self.driver.title try: self.assertEqual(title, ‘百度一,你就知道‘) except Exception as e: print(e.args[0]) if __name__ == ‘__main__‘: unittest.main(verbosity=2)
二、单元测试框架的优化(Json)
例:新浪邮箱的登录
- 先将登录的错误信息和登录成功的验证信息分离在data目录下创建sina.json文件
- json文件内容必须使用双引号
- 获取当前工程(uiframe)和文件的路径
import os def base_dir(): return os.path.dirname(os.path.dirname(__file__)) # """获取当前工程的路径""" def filePath(directory=‘data‘,fileName=None): # 获取文件路径 return os.path.join(base_dir(),directory,fileName)
- 打开目录data下文件名为sina.json文件
-
出现错误:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 92: illegal multibyte sequence
-
获取不到sina.json文件内容的解决办法:1、设置IDE的编码为UTF-8 2、读取文件的时候,设置编码
import json from utils.pathUtils import base_dir,filePath import os def readJson(): return json.load(open(filePath(directory=‘data‘,fileName=‘sina.json‘),encoding=‘utf-8‘)) print(readJson())
输出为字典格式 {‘login‘: {‘notEmail‘: ‘请输入邮箱名‘, ‘formatEmail‘: ‘您输入的邮箱名格式不正确‘, ‘errorEmail‘: ‘登录名或密码错误‘, ‘username‘: ‘wuya1303@sina.com‘, ‘password‘: ‘admin123‘, ‘shouYe‘: ‘邮箱首页‘, ‘title‘: ‘新浪邮箱‘, ‘url‘: ‘https://m0.mail.sina.com.cn/classic/index.php#title=%25E9%2582%25AE%25E7%25AE%25B1%25E9%25A6%2596%25E9%25A1%25B5&action=mailinfo‘}}
- 测试模块进行测试 得到的验证信息即是sina.json文件中的信息
from page.sina import Sina from page.init import InitSina from utils.jsonutils import readJson import unittest class sinaTest(InitSina,Sina): def test_sina_001(self): self.login(username=‘‘,password=‘‘) self.assertEqual(self.getDivText,readJson()[‘login‘][‘notEmail‘]) def test_sina_002(self): self.login(username=‘5566..oo‘,password=‘‘) self.assertEqual(self.getDivText,readJson()[‘login‘][‘formatEmail‘]) def test_sina_003(self): self.login(username=‘15730996037‘,password=‘asd‘) self.assertEqual(self.getDivText,readJson()[‘login‘][‘errorEmail‘]) def test_sina_004(self): self.login(username=readJson()[‘login‘][‘username‘], password=readJson()[‘login‘][‘password‘]) self.assertEqual(self.getShouye,readJson()[‘login‘][‘shouYe‘]) def test_sina_005(self): self.login(username=readJson()[‘login‘][‘username‘], password=readJson()[‘login‘][‘password‘]) self.assertEqual(self.getNick,readJson()[‘login‘][‘username‘]) def test_sina_006(self): self.login(username=readJson()[‘login‘][‘username‘], password=readJson()[‘login‘][‘password‘]) self.assertEqual(self.getTitle,readJson()[‘login‘][‘title‘]) def test_sina_007(self): self.login(username=readJson()[‘login‘][‘username‘], password=readJson()[‘login‘][‘password‘]) self.assertEqual(self.getUrl, readJson()[‘login‘][‘url‘]) if __name__ == ‘__main__‘: unittest.main(verbosity=2)
安装yaml pip3 install pyyaml (Python操作Yaml文件)
例:新浪邮箱的登录
- 先将登录的错误信息和登录成功的验证信息分离在data目录下创建sina.yaml文件
- 获取当前工程(uiframe)和文件的路径
import os def base_dir(): return os.path.dirname(os.path.dirname(__file__)) # """获取当前工程的路径""" def filePath(directory=‘data‘,fileName=None): # 获取文件路径 return os.path.join(base_dir(),directory,fileName)
- 打开目录data下文件名为sina.yaml文件
import yaml from utils.pathUtils import filePath import os def readYaml(): return yaml.load(open(filePath(fileName=‘sina.yaml‘),encoding=‘utf-8‘)) print(readYaml()) {‘login‘: {‘notEmail‘: ‘请输入邮箱名‘, ‘formatEmail‘: ‘您输入的邮箱名格式不正确‘, ‘errorEmail‘: ‘登录名或密码错误‘, ‘username‘: ‘wuya1303@sina.com‘, ‘password‘: ‘admin123‘}}
- 测试模块进行测试 得到的验证信息即是sina.yaml文件中的信息
from page.sina import Sina from page.init import InitSina from utils.yamlUtils import readYaml from utils.yamlUtils import getUrl import unittest class sinaTest(InitSina,Sina): def test_sina_001(self): self.login(username=‘‘,password=‘‘) self.assertEqual(self.getDivText,readYaml()[‘login‘][‘notEmail‘]) def test_sina_002(self): self.login(username=‘5566..oo‘,password=‘‘) self.assertEqual(self.getDivText,readYaml()[‘login‘][‘formatEmail‘]) def test_sina_003(self): self.login(username=‘15730996037‘,password=‘asd‘) self.assertEqual(self.getDivText,readYaml()[‘login‘][‘errorEmail‘]) if __name__ == ‘__main__‘: unittest.main(verbosity=2)
四、网址的分离 创建config.yaml文件写入网址
- 获取当前工程和文件的路径
import os def base_dir(): return os.path.dirname(os.path.dirname(__file__)) # """获取当前工程的路径""" def filePath(directory=‘data‘,fileName=None): # 获取文件路径(默认参数) return os.path.join(base_dir(),directory,fileName)
- 打开目录data下文件名为sina.yaml内容和config.yaml内容
import yaml from utils.pathUtils import filePath import os def readYaml(): return yaml.load(open(filePath(directory=‘data‘,fileName=‘sina.yaml‘),encoding=‘utf-8‘)) print(readYaml()) def getUrl(): return yaml.load(open(filePath(directory=‘config‘,fileName=‘config.yaml‘),encoding=‘utf-8‘))[‘url‘][‘qa‘] print(getUrl()) {‘login‘: {‘notEmail‘: ‘请输入邮箱名‘, ‘formatEmail‘: ‘您输入的邮箱名格式不正确‘, ‘errorEmail‘: ‘登录名或密码错误‘, ‘username‘: ‘wuya1303@sina.com‘, ‘password‘: ‘admin123‘}} https://mail.sina.com.cn/
- init里面 导入获取的网址信息
import unittest from selenium import webdriver from utils.yamlUtils import getUrl class InitSina(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get(getUrl()) self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit()
- 测试模块进行测试 导入网址的信息
五,pytest初步应用
Pytest?起unittest来说?较?由,使?unittest?先要继承TestCase的类,但是pytest是不需要的,安装成功后,直接编写测试函数或者测试?法就可以使?了。
安装的命令为:
Pip3 install pytest
安装成功后,就可以直接的使?。在pytest中,它会?先寻找以test开头或者以test结尾的测试模块,然后执?模块??以test开头或者是以test结尾的测试代码,这?依据这个要去,编写测试模块。建立新的工程unit,创建文件夹tests。
创建新的文件test_add.py 点击底部Terminal 再进入到tests 再输入python -m pytest -v test_add.py命令即可运行