自动化测试及其 unittest模块,selenium模块,HTMLTestRunner模块的基本使用

测试定义

软件测试(英语:Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。

测试分类

1、单元测试

**单元测试即为将整个软件分解为各个功能,随后对单元进行测试。**此类测试策略的优点在于所需分析数据较少,且针对性较强,程序开发者于开发过程中可通过操作经验明确出现问题的大致区域,随后针对此类问题对相关单元展开分析,进行问题排查。但需注意的是,某些程序中无具体单元驱动程序,即单个单元无法有效驱动,易出现问题,若针对此类软件展开测试,需重点注意此类分解单元。

2、集成测试

集成测试与单元测试相反,原理为将部分需测试部分作为整体进行集成,随后针对此类集成部分进行测试。测试要求为此类被测试集成题应具有一定的结构,且属于非渐增方式集成。对于较大软件而言,集成测试方式较单元测试方式而言较为繁琐,目前多数大型软件的测试皆采取渐增方式进行测试。渐增测试方式为集成测试方式的衍生,其能够按照不同次序对软件进行测试,日常测试中,常将两类方式进行集成测试,随后按照次序展开选择。

3、黑盒测试

**黑盒测试,顾名思义即为将软件测试环境模拟为不可见的“黑盒”。通过数据输入观察数据输出,检查软件内部功能是否正常。**测试展开时,数据输入软件中,等待数据输出。数据输出时若与预计数据一致,则证明该软件通过测试,若数据与预计数据有出入,即便出入较小亦证明软件程序内部出现问题,需尽快解决。

4、白盒测试

**白盒测试相对于黑盒测试而言具有一定透明性,原理为根据软件内部应用、源代码等对产品内部工作过程进行调试。**测试过程中常将其与软件内部结构协同展开分析,最大优点即为其能够有效解决软件内部应用程序出现的问题,测试过程中常将其与黑盒测试方式结合,当测试软件功能较多时,白盒测试法亦可对此类情况展开有效调试。其中,判定测试作为白盒测试法中最为主要的测试程序结构之一,此类程序结构作为对程序逻辑结构的整体实现,对于程序测试而言具有较为重要的作用。此类测试方式针对程序中各类型的代码进行覆盖式检测,覆盖范围较广,适用于多类型程序。实际检测中,白盒测试法常与黑盒检测法并用,以动态检测方式中测试出的未知错误为例,首先使用黑盒检测法,若程序输入数据与输出数据相同,则证明内部数据未出现问题,应从代码方面进行分析,若出现问题则使用白盒测试法,针对软件内部结构进行分析,直至检测出问题所在,及时加以修改。

python单元测试模块——unittest

断言定义

编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

#断言 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看
#作是异常处理的一种高级形式。
#assert代表断言,假设断言的条件为真,如果为假诱发AssertionError
#assert 断言的条件,错误的提升
a = 0
assert a,"a is false"
print(a)
#上面的断言代码类似下面的if语句
a = 1
if not a:
    raise AssertionError("a is false")
print(a)
断言的优势

1、编写防御性代码

2、起到特殊的注释作用

TestCase(测试用例): 所有测试用例的基类,它是软件 测试中最基本的组成单元。一个test case就是一个测试用例,是一个完整的测试流程,包括测试前环境的搭建setUp,执行测试代码(run),以及测试后环境的还原(tearDown)。测试用例是一个完整的测试单元,可以对某一问题进行验证。

TestSuite(测试套件):多个测试用例test case集合就是TestSuite,TestSuite可以嵌套TestSuite

**TestLoder:**是用来加载 TestCase到TestSuite中,其中有几个loadTestsFrom_()方法,就是从各个地方寻找TestCase,创建他们的实例,然后add到TestSuite中,再返回一个TestSuite实例

**TextTestRunner:**是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法

**TextTestResult:**测试结果会保存到TextTestResult实例中,包括运行了多少用例,成功与失败多少等信息

**TestFixture:**又叫测试脚手,测试代码的运行环境,指测试准备前和执行后要做的工作,包括setUp和tearDown方法

import unittest
#unittest使用的方法
class OurTest(unittest.TestCase):
    """
    继承编写测试的基础类
    """
    def setUp(self):
        """
        类似于类的init方法,在测试执行之初制动执行,通常用来做测试数据的准备
        """
    def test_add(self):
        """
        具体测试的方法,使用testcase编写具体测试的方法,函数名称必须以test开头
        函数当中的内容通常是获取预期值,和运行结果值
        然后对两个值进行断言
        """
    def tearDown(self):
        """
        类似类的del方法,用来回收测试的环境
        """

if __name__ == "__main__":
    unittest.main()
    
#-------------------------------------------------------------------------
import unittest
class OurTest(unittest.TestCase):
    """
    继承编写测试的基础类
    """
    def setUp(self):
        """
        类似于类的init方法,在测试执行之初制动执行,通常用来做测试数据的准备
        """
        self.a = 1 #测试使用的参数1
        self.b = 1 #测试使用的参数2
        self.result = 3 #预期的结果
    def test_add(self):
        """
        具体测试的方法,使用testcase编写具体测试的方法,函数名称必须以test开头
        函数当中的内容通常是获取预期值,和运行结果值
        然后对两个值进行断言
        unittest模块已经封装好了更多的断言方法
        """
        run_result = self.a + self.b
        self.assertEqual(run_result,self.result,"self.a+self.b不等于3") #断言两个值相等
    def tearDown(self):
        """
        类似类的del方法,用来回收测试的环境
        """
if __name__ == "__main__":
    unittest.main()

断言常用的方法

断言方法—————》断言描述
assertEqual(arg1, arg2, msg=None)—————》验证arg1=arg2
assertNotEqual(arg1, arg2, msg=None)—————》验证arg1 != arg2
assertTrue(expr, msg=None)——————-———————》验证expr是true,如果为false
assertFalse(expr,msg=None)—————————————》验证expr是false,如果为true
assertIs(arg1, arg2, msg=None)—————————》验证arg1、arg2是同一个对象
assertIsNot(arg1, arg2, msg=None)———————》验证arg1、arg2不是同一个对象
assertIsNone(expr, msg=None)———————————》验证expr是None
assertIsNotNone(expr, msg=None)—————————》验证expr不是None
assertIn(arg1, arg2, msg=None)—————————》验证arg1是arg2的子串
assertNotIn(arg1, arg2, msg=None)—————————》验证arg1不是arg2的子串
assertIsInstance(obj, cls, msg=None)———————》验证obj是cls的实例
ssertNotIsInstance(obj, cls, msg=None)—————》验证obj不是cls的实例

python web自动化测试模块 selenium

Selenium 本来就是web功能测试的一个很棒的工具,之前和python没有关系,后来python编写调用selenium的模块。使用python可以驱动selenium然后驱动浏览器内核进行浏览器控制,所以selenium通常用于自动化测试和爬虫两个方向的代码。

Selenium在python当中是一个三方模块,安装需要先安装selenium模块,然后安 装对应的浏览器模块。

1,安装selenium模块

activate DjangoPath——》下切换到配置环境的路径下

pip install selenium——》安装selenium模块,

2,安装浏览器的驱动

①首先查看版本浏览器

在这里插入图片描述

②查看表格对应版本

驱动版本——————————————浏览器版本
ChromeDriver 76.0.3809.12 (2019-06-07)---------Supports Chrome version 76
ChromeDriver 75.0.3770.8 (2019-04-29)---------Supports Chrome version 75
ChromeDriver v74.0.3729.6 (2019-03-14)--------Supports Chrome v74
ChromeDriver v2.46 (2019-02-01)----------Supports Chrome v71-73
ChromeDriver v2.45 (2018-12-10)----------Supports Chrome v70-72
ChromeDriver v2.44 (2018-11-19)----------Supports Chrome v69-71
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70
ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69
ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68
ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67
ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66
ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65
ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64

③安装chrome的驱动

http://npm.taobao.org/mirrors/chromedriver/——》安装chrome的驱动

④将驱动放到一个配置了path环境变量的目录当中

⑤编写一段测试代码

from selenium import webdriver
#实例化一个浏览器驱动
chrome = webdriver.Chrome()
#访问页面
chrome.get("https://www.baidu.com/")
#捕获元素
inputs = chrome.find_element_by_id("kw")
#对元素进行操作
inputs.send_keys("老边饺子")
button = chrome.find_element_by_id("su")
button.click()
#关闭浏览器
chrome.close()

unittest与selenium模块的结合

import unittest
from time import sleep
from selenium import webdriver

class YouJiuyeTest(unittest.TestCase):
    def setUp(self):
        self.chrome = webdriver.Chrome()
        self.chrome.get("http://xue.ujiuye.com/foreuser/login/")
    def test_login_password(self):
        username_d1 = self.chrome.find_element_by_id("username_dl")
        password_dl = self.chrome.find_element_by_id("password_dl")
        button = self.chrome.find_elements_by_class_name("loginbutton1")

        username_d1.send_keys("13331153361")
        password_dl.send_keys("123")
        button[0].click()

        text = self.chrome.find_element_by_id("J_usernameTip").text
        self.assertEqual("密码应该为6-20位之间!",text,"密码太短提示内容有误")
    def test_login_username(self):
        username_d1 = self.chrome.find_element_by_id("username_dl")
        password_dl = self.chrome.find_element_by_id("password_dl")
        button = self.chrome.find_elements_by_class_name("loginbutton1")

        username_d1.send_keys("13331153361")
        password_dl.send_keys("123456789")
        button[0].click()

        text = self.chrome.find_element_by_id("J_usernameTip").text
        self.assertEqual("账号不存在", text, "提示内容有误")

    def tearDown(self):
        sleep(10)
        self.chrome.close()

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

    
#结构优化
import unittest
from time import sleep
from selenium import webdriver

class YouJiuyeTest(unittest.TestCase):
    def setUp(self):
        self.chrome = webdriver.Chrome()
        self.chrome.get("http://xue.ujiuye.com/foreuser/login/")

    def login(self,username,pasword):
        username_d1 = self.chrome.find_element_by_id("username_dl")
        password_dl = self.chrome.find_element_by_id("password_dl")
        button = self.chrome.find_elements_by_class_name("loginbutton1")
        username_d1.send_keys(username)
        password_dl.send_keys(pasword)
        button[0].click()
        text = self.chrome.find_element_by_id("J_usernameTip").text
        return text

    def test_login_password(self):
        text = self.login("13331153361","123")
        self.assertEqual("密码应该为6-20位之间!",text,"密码太短提示内容有误")

    def test_login_username(self):
        text = self.login("13331153361","12345678")
        self.assertEqual("账号不存在", text, "提示内容有误")

    def tearDown(self):
        sleep(10)
        self.chrome.close()

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

python生成测试报告

HTMLTestRunner 模块时python三方的生成测试报告的模块,他可以将python unittest模块测试的结果编写成一个html报告。Htmltestrunner 只支持python2 ,python3如果进行使用,需要手动修改源码。

1,下载HTMLTestRunner模块

https://pypi.org/project/HTMLTestRunner/

2,复制源码到python三方目录下的HTMLTestRunner.py当中

3,按照python3 修改源码

①94行将import stringio 改为 import io

在这里插入图片描述

②539行 将stringio改为io

在这里插入图片描述

③631行 修改print格式

在这里插入图片描述

④642行 将has_key 改为not in

在这里插入图片描述

⑤766行 将decode改为encode

在这里插入图片描述

⑥772行 将decode改为encode

在这里插入图片描述

代码如下:

import unittest
from time import sleep
from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner

class YouJiuyeTest(unittest.TestCase):
    def setUp(self):
        self.chrome = webdriver.Chrome()
        self.chrome.get("http://xue.ujiuye.com/foreuser/login/")

    def login(self,username,pasword):
        username_d1 = self.chrome.find_element_by_id("username_dl")
        password_dl = self.chrome.find_element_by_id("password_dl")
        button = self.chrome.find_elements_by_class_name("loginbutton1")
        username_d1.send_keys(username)
        password_dl.send_keys(pasword)
        button[0].click()
        text = self.chrome.find_element_by_id("J_usernameTip").text
        return text

    def test_login_password(self):
        text = self.login("13331153361","123")
        self.assertEqual("密码应该为6-20位之间!",text,"密码太短提示内容有误")

    def test_login_username(self):
        text = self.login("13331153361","12345678")
        self.assertEqual("账号不存在", text, "提示内容有误")

    def tearDown(self):
        sleep(10)
        self.chrome.close()

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(YouJiuyeTest("test_login_password"))
    suite.addTest(YouJiuyeTest("test_login_username"))

    with open("report.html","wb") as f:
        runner = HTMLTestRunner(
            stream=f,
            title="教学测试",
            description="就是一个教学测试"
        )
        runner.run(suite)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
导入HTMLTestRunner到Python,生成测试报告的工具类 """ A TestRunner for use with the Python unit testing framework. It generates a HTML report to show the result at a glance. The simplest way to use this is to invoke its main method. E.g. import unittest import HTMLTestRunner ... define your tests ... if __name__ == '__main__': HTMLTestRunner.main() For more customization options, instantiates a HTMLTestRunner object. HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g. # output to a file fp = file('my_report.html', 'wb') runner = HTMLTestRunner.HTMLTestRunner( stream=fp, title='My unit test', description='This demonstrates the report output by HTMLTestRunner.' ) # Use an external stylesheet. # See the Template_mixin class for more customizable options runner.STYLESHEET_TMPL = '<link rel="stylesheet" href="my_stylesheet.css" type="text/css">' # run the test runner.run(my_test_suite) ------------------------------------------------------------------------ Copyright (c) 2004-2007, Wai Yip Tung All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name Wai Yip Tung nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值