Unittest框架
Unittest框架:框架=测试模块+测试管理模块+测试统计模块,python的内置模块
import unittest
Unittest框架四大组件:
1、TestCase 测试用例
2.TestFixture 测试用例夹具 测试用例需要执行的前置和后置
3.TestSuite 测试套件 把需要执行的测试用例汇总在一起
4、TestRunner 测试运行 执行测试用例
Test Case 测试用例
规则:
1、用例类必须继承Unittest.TestCase,并且以test开头
2、测试方法,都必须以test_开头
3、用例执行的顺序按照ASCII
0.9 a-z A-Z 顺序来执行用例
unittest也可以通过会令运行
命令执行TestShopnc类下的所有用例:python -m unittest 用例文件名.用例类名
执行某一条用例:python -m unittest 用例文件名.用例类.用例名称
import time
import unittest
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
class TestShopnc(unittest.TestCase):
#每个用例前执行 有多少用例就执行多少次
def setUp(self) -> None:
print("01 每个用例前执行 有多少用例就执行多少次")
#每个类之前执行 只执行一次
@classmethod
def setUpClass(cls) :
print("02 每个类之前执行 只执行一次")
#每个用例执行之后执行 有多少用例就执行多少次
def tearDown(self) -> None:
print("03 每个用例执行之后执行 有多少用例就执行多少次")
@classmethod
#每个类之后执行 只执行一次
def tearDownClass(cls) -> None:
print("04 每个类之后执行 只执行一次")
def test_01_login(self):
print("用例1")
def test_02_shopping(self):
print("用例2")
def test_03_add_cart(self):
print("用例3")
def test_04_payment(self):
print("用例4")
if __name__ == '__main__':
i=10
print(i)
suite=unittest.TestSuite()
#添加一个测试用例
suite.addTest(TestShopnc(methodName='test_01_login'))
#添加多个
suite.addTests([TestShopnc("test_02_shopping"),TestShopnc("test_04_payment")])
unittest.main(defaultTest="suite")
#用例加载器
suite2 = unittest.TestSuite()
case2=unittest.TestLoader().loadTestsFromTestCase(TestShopnc)
suite2.addTests(case2)
unittest.TextTestRunner().run(suite2)
suite3 = unittest.TestSuite()
#查找test开始的py文件
case3= unittest.defaultTestLoader.discover("test*.py")
suite3.addTests(case3)
unittest.main(defaultTest="suite3")
问题:如果使用了TestSuite 运行py 文件时还是执行了所有测试用例
解决方案:
注意:不用在文件中点击,运行,这种方式执行还是会执行所有测试用例 原因:没有执行if name == ‘main’: 中的代码
用例状态:
. 成功
E 用例异常
F 用例执行失败
登录京东&搜索商品&加入购物车
登录 需要滑块验证 采取手动方式
import time
import unittest
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from DrissionPage import WebPage
from DrissionPage.common import By as DBy
login_name = "账户"
pwd = "密码"
js_txt='''var list=$('.p-o-btn.addcart').filter(function(index, element) {
return $(this).attr('class').indexOf('disabled')==-1
});
if(list.length>0)
{
list[0].click();
}'''
class TestShopnc(unittest.TestCase):
#每个用例前执行 有多少用例就执行多少次
def setUp(self) -> None:
print("01 每个用例前执行 有多少用例就执行多少次")
#每个类之前执行 只执行一次
@classmethod
def setUpClass(cls) :
cls.web_driver=webdriver.Firefox()
cls.web_page=WebPage("d")
print("02 每个类之前执行 只执行一次")
#每个用例执行之后执行 有多少用例就执行多少次
def tearDown(self) -> None:
print("03 每个用例执行之后执行 有多少用例就执行多少次")
@classmethod
#每个类之后执行 只执行一次
def tearDownClass(cls):
cls.web_driver.quit()
cls.web_page.quit()
print("04 每个类之后执行 只执行一次")
# selenuim demo 开始
def test_01_login(self):
url="https://passport.jd.com/new/login.aspx"
self.web_driver.get("https://passport.jd.com/new/login.aspx")
el=(By.ID,"loginname")
WebDriverWait(self.web_driver,10).until(EC.presence_of_element_located(el))
self.web_driver.find_element(*el).send_keys(login_name)
el = (By.ID, "nloginpwd")
WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))
self.web_driver.find_element(*el).send_keys(pwd)
el = (By.ID, "loginsubmit")
WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))
self.web_driver.find_element(*el).click()
# 需要滑块验证,采取手动
time.sleep(15)
print(self.web_driver.current_url)
if 'https://aq.jd.com/certified/index' in self.web_driver.current_url:
time.sleep(3)
#验证按钮
self.web_driver.execute_script('$(".btn-def.btn-xl.mb20").click()')
time.sleep(3)
#发送短信按钮
self.web_driver.execute_script('$(".btn-def.btn-msg.btn-l").click()')
time.sleep(10)
#提交验证
self.web_driver.execute_script('$(".btn-primary.btn-m").click()')
time.sleep(30)
def test_02_shopping(self):
#key
if 'https://www.jd.com' not in self.web_driver.current_url:
self.web_driver.get("https://www.jd.com")
el=(By.ID,"key")
WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))
self.web_driver.find_element(*el).send_keys("三只松鼠大礼包")
time.sleep(5)
#//*[@id="search"]/div/div[2]/button
el = (By.XPATH, '//*[@id="search"]/div/div[2]/button')
WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))
self.web_driver.find_element(*el).click()
time.sleep(5)
def test_03_add_cart(self):
time.sleep(5)
self.web_driver.execute_script(js_txt)
# el=(By.XPATH,'/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li[5]/div/div[7]/a[3]')
# WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))
# self.web_driver.find_element(*el).click()
time.sleep(20)
#selenuim demo 结束
#drissionpage demo 开始
def test_04_login(self):
self.web_page.get("https://passport.jd.com/new/login.aspx")
el=(DBy.ID,"loginname")
self.web_page.wait.eles_loaded(el)
self.web_page.ele(el).clear()
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")
self.web_page.ele(el).input(login_name)
print("2222222222222222222222222222222222")
el = (DBy.ID, "nloginpwd")
self.web_page.wait.eles_loaded(el)
self.web_page.ele(el).input(pwd)
el = (DBy.ID, "loginsubmit")
self.web_page.wait.eles_loaded(el)
self.web_page.ele(el).click()
# 需要滑块验证,采取手动
time.sleep(15)
print(self.web_page.url)
if 'https://aq.jd.com/certified/index' in self.web_page.url:
time.sleep(3)
#验证按钮
self.web_page.run_js('$(".btn-def.btn-xl.mb20").click()')
time.sleep(3)
#发送短信按钮
self.web_page.run_js('$(".btn-def.btn-msg.btn-l").click()')
time.sleep(10)
#提交验证
self.web_page.run_js('$(".btn-primary.btn-m").click()')
time.sleep(30)
def test_05_shopping(self):
#key
if 'https://www.jd.com' not in self.web_page.url:
self.web_page.get("https://www.jd.com")
el=(DBy.ID,"key")
self.web_page.wait.eles_loaded(el)
self.web_page.ele(el).input("麻辣王子")
time.sleep(5)
el = (DBy.XPATH, '//*[@id="search"]/div/div[2]/button')
self.web_page.wait.eles_loaded(el)
self.web_page.ele(el).click()
time.sleep(5)
def test_06_add_cart(self):
time.sleep(5)
self.web_page.run_js(js_txt)
time.sleep(10)
#drissionpage demo 结束