5 unittest与selenium

封装待测试功能的操作

1.完成创建Commonlib目录,创建Commonlib.py文件,并将前面封装的selenium拷贝进去

from selenium import webdriver
import time
class Commonshare(object):
    # 初始化方法
    def __init__(self):
        # 创建浏览器对象
        self.driver = webdriver.Firefox()
        # 设置隐式等待
        self.driver.implicitly_wait(5)
        # 设置浏览器的最大化
        self.driver.maximize_window()

    def open_url(self,url):
        # 请求指定站点
        self.driver.get(url)
        time.sleep(3)

    def locateElement(self, locate_type, value):
        # 判断定位方式并调用相关方法
        el = None
        if locate_type == 'id':
            el = self.driver.find_element_by_id(value)
        elif locate_type == 'name':
            el = self.driver.find_element_by_name(value)
        elif locate_type == 'class':
            el = self.driver.find_element_by_class_name(value)
        elif locate_type == 'text':
            el = self.driver.find_element_by_link_text(value)
        elif locate_type == 'xpath':
            el = self.driver.find_element_by_xpath(value)
        elif locate_type == 'css':
            el = self.driver.find_element_by_css_selector(value)
        # 如果el不为None,则返回
        if el is not None:
            return el

    # 指定对某一元素的点击操作
    def click(self, locate_type, value):
        # 调用自己创建的locateElement方法定位元素
        el = self.locateElement(locate_type,value)
        el.click()
        time.sleep(1)

    # 对指定的元素进行数据输入
    def input_data(self,locate_type,value,data):
        # 调用自己创建的locateElement方法定位元素
        el = self.locateElement(locate_type,value)
        el.send_keys(data)

    # 获取指定元素的文本内容
    def get_text(self, locate_type, value):
        # 调用自己创建的locateElement方法定位元素
        el = self.locateElement(locate_type, value)
        return el.text

    # 获取指定元素的属性值
    def get_attr(self, locate_type, value, data):
        # 调用自己创建的locateElement方法定位元素
        el = self.locateElement(locate_type, value)
        return el.get_attribute(data)



    # 收尾清理方法
    def __del__(self):
        time.sleep(3)
        self.driver.quit()

2.创建Busniess目录,创建Business.py文件,并编写如下

# 导入已经封装好selenium的CommonShare类
from CommonLib.Commonlib import Commonshare

# 继承CommonShare,继承之后Commonshare中的方法都能使用
class Login(Commonshare):
    def login_yhd(self, user, pwd):
        self.open_url('http://www.yhd.com')
        # 点击登陆
        self.click('class', 'hd_login_link')
        # 输入账号
        self.input_data('id', 'un', user)
        # 输入密码
        self.input_data('id', 'pwd', pwd)
        # 点击登陆
        self.click('id', 'login_button')

if __name__ == '__main__':
    login = Login()
    login.login_yhd('xxxxxxx','xxxxxx')

3.创建Testcase目录编写测试用例testcase.py文件,如下

import unittest
# 从Business组件中导入我们定义的测试登录的类
from Busniess.Login import Login

class Test(unittest.TestCase):
    def setUp(self):
        print ("开始进行测试")

    def tearDown(self):
        print('测试结束')

    # 正确登录的测试用例
    def test_001(self):
        login = Login()
        login.login_yhd('xxxxx','xxxxx')
        data = login.get_text('class','hd_login_name')
        self.assertEqual('hack_ai_buster',data)

    # 没有输账号密码直接点击登录的测试用例
    def test_002(self):
        login = Login()
        login.login_yhd('','')
        data = login.get_text('id','error_tips')
        self.assertEqual('请输入账号和密码',data)

    # 随意输入账号,不输入密码的测试用例
    def test_003(self):
        login = Login()
        login.login_yhd('hgvjchgc','')
        data = login.get_text('id','error_tips')
        self.assertEqual('请输入密码',data)

    # 用于演示出bug的测试用例
    def test_004(self):
        login = Login()
        login.login_yhd('hgvjchgc','')
        data = login.get_text('id','error_tips')
        # 我们故意写错预期结果,让这个断言抛出
        self.assertEqual('请输入密码itcast',data)

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

4.在Testcase目录编写测试用例testcase.py文件,如下

import unittest
from Testcase.testcase import Test

class Suit(unittest.TestCase):
    def test_suit(self):
        # 定义要是用的测试用例列表
        case_list = ['test_002','test_003','test_004']
        # 创建测试套件
        mysuit = unittest.TestSuite()
        # 遍历测试用例列表
        for case in case_list:
            # 将测试用例添加到测试套件中
            mysuit.addTest(Test(case))
        # 运行Runner执行测试,verbosity=2指定为每个测试用例生成报告,run中传入要执行的测试套件
        unittest.TextTestRunner(verbosity=2).run(mysuit)


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