unittest相关语法和脚本

unittest2是一个单元测试框架

总结:

1.要用unittest框架,就需要导入import unittest的一个类库

2.方法前置、方法后置、类前置、类后置,关于类的需要加标签是@classmethod

3.class类后面需要引用unittest.testcase的父类

4.调用unittest框架,需要在main函数下进行,unittest.main()

5.测试方法的名字必须是test_开头

6.assert断言函数,self.assertIn("用户名已存在",str(response))

7.测试方法的执行顺序,取决于字母的排列顺序

一、语法

1.导入unittest类库,import unittest

2.def setUp(self) ,每个测试方法前做的预置条件

3.def tear_Down(self) ,每个测试方法执行后要做的场景还原

4.setUpclass(self):执行每个类前要做的预置条件,一个类只执行一遍,这个方法是优先于setup

要加装饰器@classmethod

5.def tearDownClass(sef):执行每个类后的场景还原,一个类只执行一遍,这个方法是仅次于teardown,要加装饰器@classmethod

6.cls表示当前这个类本身,表示这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量

#   在类中所有方法前,要执行的预置条件
    @classmethod
    # cls表示当前这个类本身,表示这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(10)

    # 在类中的所有方法后,要执行的场景还原
    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

7.把重复的代码封装在一个类中,作为一个父类

import unittest2
from selenium import webdriver
import time

# 继承unittest代码库中的TestCase类,表示当前类是一个测试用例类
class BaseTestCase(unittest2.TestCase):
    #   在类中所有方法前,要执行的预置条件
    @classmethod
    # cls表示当前这个类本身,表示我这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(10)

    # 在类中的所有方法后,要执行的场景还原
    @classmethod
    def tearDownClass(cls):
        time.sleep(10)
        cls.driver.quit()

8.子类去继承父类,如果不在1个脚本里面,要写上引入语句,from 目录名.文件名 import 类名,子类名后面要继承父类名,就继承了父类的所有方法,不需要重新写前置方法或后置方法

# 用unittest2测试框架书写注册功能继承父类(重复的测试点)
from testcase.test2 import BaseTestCase


class register(BaseTestCase):

9.元素定位到的是a标签,然后它的父级是一个calss,可以要css_selector来进行元素定位

 a:nth-child(1)   是指父节点下的第一个a标签
        # 找到了父节点的元素,然后再找子元素,这个子元素是一个a标签,第1个子节点
        welcome = self.driver.find_element_by_css_selector(".site-nav-right.fr > a:nth-child(1)").text
        print(welcome)

10.找到search搜索按钮元素,并取得这个元素的属性值

# 找到search搜索按钮元素,并取得这个元素的属性值
        search = self.driver.find_element_by_css_selector(".btn1").get_attribute("value")
        print(search)

11.定义测试类要求必须继承unittest.TestCase类,class 类名(unittest.TestCase):

12.测试方法的名字必须以test_打头,表示这个用例是一个测试用例方法

13.assert断言函数,self.assertIn("用户名已存在",str(response))

self.assertEqual("我的会员中心",self.driver.title)
        self.assertEqual("http://127.0.0.1/index.php?m=user&c=index&a=index", self.driver.current_url)

断言:自动判断测试用例的结果是否成功

检查点:

页面级别的检查:网页的标题、网址

页面元素级别的检查:元素的文本、元素的某个属性

14.操作系统上的路径,获取当前文件所在的路径D:\PythonTest\Selenium Test\func\csvFileManager2.py

运行run_all_cases测试用例集,开始路径不对,会报错,所以要获取当前路径然后替换

获取当前系统路径

base_path = os.path.dirname(__file__)

把当前获取到的路径替换成获取文件的路径以及获取文件方法的路径

path = base_path.replace("func","test_data/" + filename)

15.普通的方法不能被直接运行,只有被调用才能被执行

16.按住ctrl键,可以看到testcase类里面的源代码

17.unittest.main,表示调用unittest的主方法,这样就会执行当前类中的所有方法,根据光标位置的不同,可以选择不同的测试用例

18.测试方法的执行顺序,取决于字母的排列顺序

19.在main函数中直接使用unittest.mian()

20.遍历完内容之后,把文件关掉,然后首行不读取

# 文件管理方法
def test_wenjian(filename):
    # 给定路径
    list=[]
    # filename是一个参数,所以要在方法后面加上这个参数
    paths=filename
    # 遍历完内容,把文件关掉
    with open(paths) as file:
        # 读取文件里面的内容
        rows=csv.reader(file)
        # 不读取第一行的内容
        i=0
        for row in rows:
            if i==0:
                pass
            else:
                list.append(row)
            i=i+1
    # 读完之后,把列表值返回下
    print(list)
    return list

21.@ddt.ddt()
# 在类前加一个装饰器@ddt.ddt(),表示当前类是一个数据驱动类,类中有测试用例执行不通过时,能进行下一条用例的测试

二、预置条件、场景还原语法调试脚本

# 导入unittest包
import unittest2

class unittest2_text(unittest2.TestCase):
    # 在执行每个测试方法前,要做的预置条件
    def setUp(self):
        print(1)
    # 在执行每个测试方法后,要做的场景还原
    def tearDown(self):
        print(2)
    # 在执行每个类前,要做的预置条件,有装饰器
    @classmethod
    def setUpClass(self):
        print(3)
    # 在执行每个类后,要做的场景还原,有装饰器
    @classmethod
    def tearDownClass(self):
        print(4)
    # 执行方法,方法名前得加test_,这样unittest才会去执行这个方法
    def test_login(self):
        print(5)
        # 执行方法,方法名前如果不加test_,可以通过调用的方式去执行
        self.register()
    def register(self):
        print(6)
    def test_login1(self):
        print(7)
# 表示调用unittest2的主方法,这样就会执行当前类中的所有方法
if __name__ == '__main__':
    unittest2.main()

三、unittest封装登录脚本-用了类前置和类后置

import unittest2
from selenium import webdriver

# 继承unittest代码库中的TestCase类,表示当前的类是一个测试用例类
class unittest2_text(unittest2.TestCase):
    def test_login(self):
        self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=login")
        self.driver.find_element_by_id("username").send_keys("lala")
        self.driver.find_element_by_id("password").send_keys("123456")
        self.driver.find_element_by_class_name("login_btn").click()

    #   在类中所有方法前,要执行的预置条件
    @classmethod
    # cls表示当前这个类本身,表示这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(10)

    # 在类中的所有方法后,要执行的场景还原
    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

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

四、unittest封装注册脚本,子类去继承父类

父类脚本

import unittest2
from selenium import webdriver
import time

# 继承unittest代码库中的TestCase类,表示当前类是一个测试用例类
class BaseTestCase(unittest2.TestCase):
    #   在类中所有方法前,要执行的预置条件
    @classmethod
    # cls表示当前这个类本身,表示我这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(10)

    # 在类中的所有方法后,要执行的场景还原
    @classmethod
    def tearDownClass(cls):
        time.sleep(10)

子类脚本

# 用unittest2测试框架书写注册功能继承父类(重复的测试点)
from testcase.test2 import BaseTestCase


class register(BaseTestCase):
    def test_register(self):
        self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=reg")
        self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=reg")
        self.driver.find_element_by_name("username").send_keys("wuxn")
        self.driver.find_element_by_name("password").send_keys("Abc123!")
        self.driver.find_element_by_name("userpassword2").send_keys("Abc123!")
        self.driver.find_element_by_name("mobile_phone").send_keys("18658194622")
        self.driver.find_element_by_name("email").send_keys("2552803263@qq.com")
        self.driver.find_element_by_class_name("reg_btn").click()

五、注册10个用户,调用csv公共方法,引用testcase的父类

文件管理公共方法

# 建一个文件管理器的公共方法,给定一个文件变量名,比较灵活
# 先过面向过程
# 导入类库
import csv
import unittest

# 文件管理方法
def test_wenjian(filename):
    # 给定路径
    list=[]
    # filename是一个参数,所以要在方法后面加上这个参数
    paths=filename
    # 遍历完内容,把文件关掉
    with open(paths) as file:
        # 读取文件里面的内容
        rows=csv.reader(file)
        # 不读取第一行的内容
        i=0
        for row in rows:
            if i==0:
                pass
            else:
                list.append(row)
            i=i+1
    # 读完之后,把列表值返回下
    print(list)
    return list

testcase公共类

# 要被引用的父类脚本
import unittest2
from selenium import webdriver
import time

# 继承unittest代码库中的TestCase类,表示当前类是一个测试用例类
class BaseTestCase(unittest2.TestCase):
    #   在类中所有方法前,要执行的预置条件
    @classmethod
    # cls表示当前这个类本身,表示我这个driver不再是一个方法内部的变量了,针对整个类都可以使用的变量
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(10)

    # 在类中的所有方法后,要执行的场景还原
    @classmethod
    def tearDownClass(cls):
        time.sleep(10)
        cls.driver.quit()


注册10个用户,调用csv公共方法,引用testcase的父类

# 注册10个用户,调用csv公共方法,引用testcase的父类
import ddt
import unittest

# 调用csv公共方法要引入的文件名及方法
from test_5 import test_wenjian
# 引用testcase父类需要引入的目录文件名及方法
from test_4 import BaseTestCase

# 定义注册类
@ddt.ddt()
# 在类前加一个装饰器@ddt.ddt(),表示当前类是一个数据驱动类,类中有测试用例执行不通过时,能进行下一条用例的测试
class regieter(BaseTestCase):

    # 给变量文件指定文件名,并读取内容给table
    list=test_wenjian('register1.csv')
    # 在方法前加上@ddt.data(*table),表示要传的数据不是一个整体,而是按照行数分成行数个变量,通过data
    # 方法转换成row
    @ddt.data(*list)
    def test_register(self,row):
        self.driver.get("http://127.0.0.1/index.php?m=user&c=public&a=reg")
        self.driver.find_element_by_name("username").send_keys(row[0])
        self.driver.find_element_by_name("password").send_keys(row[1])
        self.driver.find_element_by_name("userpassword2").send_keys(row[2])
        self.driver.find_element_by_name("mobile_phone").send_keys(row[3])
        self.driver.find_element_by_name("email").send_keys(row[4])
        self.driver.find_element_by_class_name("reg_btn").click()

csv文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值