精华内容
下载资源
问答
  • 在本系列的第一篇文章“我们的测试为什么不够敏捷”中,根据实例总结出敏捷自动化测试的两大阻碍:“脚本维护困难”、“断言条件繁琐”。本文针对在不失自动化测试有效性的前提下如何降低断言成本来分享一些实践经验...
  • APP UI自动化测试思路总结

    python+appium自动化测试系列就要告一段落了,本篇博客咱们做个小结。

    首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌握的,毕竟谁也不会跟钱过不去。

    接下来,一起总结一下APP UI自动化测试的思路吧。

    一,开发语言选择

    通常用于自动化测试的编程语言有:Python、Java、Javascript、Ruby、C#、PHP等。一般我们会选择自己熟悉的编程语言来编写自动化脚本,但对于编程基础基本为0的童鞋(或者专注于做自动化测试的童鞋),推荐学习使用Python。

    相对于其他语言,Python做自动化测试有以下优点:

    对于初学者来说,Python语法简洁,可读性强,易于学习

    有强大的第三方库,编写脚本效率更高

    Python中的Pytest自动化测试框架是目前最流行的测试框架之一

    如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以810119819,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

    二,测试框架选择

    选择编开发语言之后,我们需要选择UI测试框架。目前较为主流或者使用较多的APP UI自动化测试框架有Appium、Airtest等。

    1,Appium
    开源

    Appium server支持在Windows、macOS、Linux上运行

    支持多种主流编程语言,如Python、Java、Javascript、Ruby等

    支持Android、ios、H5自动化测试(集成了UiAutomator、UiAutomation框架)

    环境搭建较为复杂

    2,Airtest
    由网易开发( 官方文档 ),只支持python语言

    提供集成Airtest与Poco两个测试框架的强大的IDE,对新手很友好

    集成基于图像识别的UI自动化测试框架airtest,即使不懂代码也能编写自动化脚本

    跨平台,可对Windows、Android和iOS应用软件进行自动化测试

    对游戏测试较为友好

    Airtest与Poco本质上是python的两个第三方库,测试环境搭建没有Appium那么复杂

    3,选择框架
    根据实际情况选择合适的框架。

    以下情况可以优先选择网易的Airtest ( Airtest官网 ):

    无编程基础

    游戏测试

    测试场景较为单一(Appium相对来说较为笨重)

    支付宝小程序自动化(博主目前使用Airtest集成的Poco框架做支付宝小程序自动化测试)

    以下情况建议选择Appium:

    测试场景比较复杂(如需要多台手机批量测试)

    测试脚本语言非Python(Airtest目前只支持Python)

    三,单元测试框架选择

    区别于上面所说的UI测试框架,单元测试框架用于加载测试用例、执行测试用例、断言、输出测试结果等。

    不同的开发语言有各自对应的单元测试框架,如Java有JUnit、TestNG、Robot等,Python有unittest、pytest等。博主主要使用Python做自动化测试,所以这里只针对Python单元测试框架做说明。

    python主流的单元测试框架:

    unittest,Python自带的单元测试框架

    pytest,基于unittest开发,易用性好,信息更详细,插件众多

    robot framework,基于Python的关键字驱动测试框架,有界面,自带报告及log,功能完善,清晰美观

    这里强烈推荐使用pytest,功能强大且容易上手, 官方文档 为英文,中文可参考 Pytest 使用手册 。

    四,测试环境搭建

    1,测试电脑选择
    有条件的话建议使用Mac机器专门用于UI自动化测试,因为ios app ui自动化只能在Mac机器上进行。

    2,测试手机选择
    刚开始进行测试脚本调试时可以选择模拟器,Android模拟器可选择Gernymotion、夜神模拟器,具体参考博客Android模拟器的使用

    待整个测试项目开发完成后,建议换成真机跑自动化脚本,这样更接近真实的用户使用场景。

    3,开发语言环境
    建议安装python 3以上的版本,官方已经停止对python2版本的更新维护。

    4,UI自动化测试框架环境搭建
    windows环境下搭建Appium请参考博客appium环境搭建,Mac下搭建Appium稍微复杂点,后续会写博客分享。

    若选择Airtest框架的话,请参考 官网 。

    五,脚本编写

    1,编写测试demo
    为了验证整个测试环境是否搭建成功、是否能跑通用例,一般我们需要先编写简单的测试脚本并执行,通过则说明整个环境搭建成功。

    2,确定目录结构
    推荐使用Page Object设计模式来开发APP UI自动化测试项目,请参考博客Page Object设计模式。

    3,选择测试报告
    不同的开发语言、不同的单元测试框架可选用不同的测试报告。在python中,unittest框架使用HTMLTestRunner或BSTestrunner生成测试报告,可参考博客unittest单元测试框架。Pytest框架使用pytest-html生成报告或通过allure定制测试报告。

    以上步骤完成后,继续往测试项目里新增测试用例便可。

    六,Jenkins集成

    根据上述步骤编写完成整个app UI自动化测试项目,且运行一段时间稳定后,就可以考虑进行Jenkins的集成,请参考博客 Jenkins集成appium自动化测试(Windows篇) 或 远程Jenkins新增Mac节点 。

    七,总结

    总结APP UI自动化可使用以下几种实现方式:

    1,python + appium + unittest + HTMLTestRunner

    2,python + appium + pytest + pytest-html / allure

    3,python + Airtest(AirtestIDE)

    4,python + Poco + pytest + pytest-html / allure

    可根据实际情况自行选择。

    在这里插入图片描述
    以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

    软件测试是IT相关行业中最容易入门的学科~不需要开发人员烧脑的逻辑思维、不需要运维人员24小时的随时待命,需要的是细心认真的态度和IT相关知识点广度的了解,每个测试人员从入行到成为专业大牛的成长路线可划分为:软件测试、自动化测试、测试开发工程师 3个阶段。

    这里有我整理的一些资料,如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加我们在这里插入图片描述

    展开全文
  • 软件测试的主要工作目标是验证实际结果与预期结果是一致的,在自动化软件测试中,通过断言来实现这一目的。Pytest中断言是通过Python原生的assert语句实现的,对Python原生的assert语句进行了优化,当发生断言失败时...

    软件测试的主要工作目标是验证实际结果与预期结果是一致的,在自动化软件测试中,通过断言来实现这一目的。Pytest中断言是通过Python原生的assert语句实现的,对Python原生的assert语句进行了优化,当发生断言失败时,错误信息更加丰富,方便测试时快速定位问题原因。

    正文字数5195

    不管是做API测试、Web测试还是APP测试中,测试用例是否执行成功,都是通过比较实际结果与预期结果是否一致来判断的。当预期结果与实际结果一致,则表示测试用例执行通过,当预期结果与实际结果不一致,则表示测试用例执行失败。对预期结果与实际结果进行比较的过程,在自动化软件测试中是通过断言来实现的。

    优秀的测试框架都提供了断言的方法,比如TestNG中的assertTrue、 assertEquals、assertSame等等。前面给大家介绍过Pytest的使用方法《基于Pytest框架的自动化测试开发实践(万字长文入门篇)》,本文将详细介绍Pytest的断言,与TestNG相比它更加简单,只有一个assert语句,但是功能非常强大并且简单易用。

    01 — Python原生的assert

    Python中assert语句通常用来对代码进行必要的检查,确定某种情况一定发生,或者一定不会发生。

    Python 的 assert 语句的语法是这样的:

    assert expression1 ["," expression2]
    

    expression1往往是一个条件表达式,如果条件表达式为True,则什么也不做,相当于执行了 pass 语句;如果条件表达式为False,便会抛出异常 AssertionError,并返回具体的错误信息expression2。看一个实际例子:

    # content of my_assertion.py
    def assertion():
        assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"if __name__ == '__main__':
        assertion()
    

    执行一下上面的代码看看结果:

    $ python my_assertion.py 
    Traceback (most recent call last):
      File "my_assertion.py", line 5, in <module>
        assertion()
      File "my_assertion.py", line 2, in assertion
        assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"
    AssertionError: left is [1,2,3], right is [1,2,4]
    

    可见,assert后面的条件表达式为False,抛出了AssertionError,并显示了错误信息left is [1, 2, 3], right is [1, 2, 4]。

    不过,这里还有一点小小的缺憾。并没有明确告诉开发人员,条件判断失败的具体位置。需要开发人员自己对比才发现,==左边的第三个元素和右边的第三个元素不一样。

    02 — Pytest的assert优点

    软件测试工作,经常会遇到断言失败的情况。如果每次失败,都需要测试工程师人眼去观察失败的具体原因和出错的位置,那将是非常耗时的。强大的Pytest也考虑到了广大测试工程师面临的问题,因此对Python原生的assert语句进行了优化和改进,主要在是当断言失败时,将错误的具体信息和位置显示出来,让测试工程师对失败原因一目了然。

    还是上面的例子,将其放入到测试用例(test_开头的函数)中:

    # content of test_assertion.py
    def test_assertion():
        assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"
    执行测试用例后的信息输出如下:
    
        def test_assertion():
    >       assert [1, 2, 3] == [1, 2, 4], "left is [1,2,3], right is [1,2,4]"
    E       AssertionError: left is [1,2,3], right is [1,2,4]
    E       assert [1, 2, 3] == [1, 2, 4]
    E         At index 2 diff: 3 != 4
    E         Full diff:
    E         - [1, 2, 4]
    E         ?        ^
    E         + [1, 2, 3]
    E         ?
    

    是不是有种很爽的感觉?pytest明确显示出了错误的位置是index为2的元素左右不相等。这一点点小小的改进大大提高了测试失败时定位出错原因的效率。

    在测试用例中执行assert语句,才有上面的效果,这是因为Pytest对assert语句进行了重写。在非测试用例中的assert语句,比如测试项目中的一些utils函数中,使用assert还是Python原生的效果。

    03 — Pytest 断言的用法

    在自动化测试用例中,最常用的断言是相等断言,就是断言预期结果和实际结果是一致的。通常我们断言的预期结果和实际结果的数据类型是字符串、元组、字典、列表和对象。Pytest通过assert和==能够完美支持对这些数据类型的相等断言。下面来介绍几种常见的数据类型的断言操作。

    4.1 断言字符串

    断言字符串非常简单,只需要将预期和实际的字符串,分别写在==两边,当发生断言失败时,将会列出第一个不相等元素的下标。下面是几个在实际测试工作中经常用到的几种字符串断言方式。

    # content of test_assertions.py
    class TestAssertions(object):
        def test_string_1(self):
            assert "spam" == "eggs"def test_string_2(self):
            assert "foo 1 bar" == "foo 2 bar"def test_string_3(self):
            assert "foo\nspam\nbar" == "foo\neggs\nbar"def test_string_4(self):
            def f():
                return "streaming"
            assert f().startswith('S')
    

    执行一下这些测试用例,看下输出效果,核心部分如下:

    ============================================================ FAILURES ============================================================
    __________________________________________________ TestAssertions.test_string_1 __________________________________________________
    ​
    self = <test_assertions.TestAssertions object at 0x10911a4d0>
    ​
        def test_string_1(self):
    >       assert "spam" == "eggs"
    E       AssertionError: assert 'spam' == 'eggs'
    E         - eggs
    E         + spam
    ​
    tests/test_assertions.py:3: AssertionError
    __________________________________________________ TestAssertions.test_string_2 __________________________________________________
    ​
    self = <test_assertions.TestAssertions object at 0x10911a890>
    ​
        def test_string_2(self):
    >       assert "foo 1 bar" == "foo 2 bar"
    E       AssertionError: assert 'foo 1 bar' == 'foo 2 bar'
    E         - foo 2 bar
    E         ?     ^
    E         + foo 1 bar
    E         ?     ^
    ​
    tests/test_assertions.py:6: AssertionError
    __________________________________________________ TestAssertions.test_string_3 __________________________________________________
    ​
    self = <test_assertions.TestAssertions object at 0x10911c2d0>
    ​
        def test_string_3(self):
    >       assert "foo\nspam\nbar" == "foo\neggs\nbar"
    E       AssertionError: assert 'foo\nspam\nbar' == 'foo\neggs\nbar'
    E           foo
    E         - eggs
    E         + spam
    E           bar
    ​
    tests/test_assertions.py:9: AssertionError
    __________________________________________________ TestAssertions.test_string_4 __________________________________________________
    ​
    self = <test_assertions.TestAssertions object at 0x109106a90>
    ​
        def test_string_4(self):
            def f():
                return "streaming"
        
    >       assert f().startswith('S')
    E       AssertionError: assert False
    E        +  where False = <built-in method startswith of str object at 0x1090f7bb0>('S')
    E        +    where <built-in method startswith of str object at 0x1090f7bb0> = 'streaming'.startswith
    E        +      where 'streaming' = <function TestAssertions.test_string_4.<locals>.f at 0x10914b440>()
    ​
    tests/test_assertions.py:15: AssertionError
    

    再次感觉到测试结果一目了然。

    4.2 断言函数或者接口返回值

    对函数返回值、接口返回值的断言,应该是软件自动化测试中最常见的场景了。这里以函数返回值的断言为例,

    def test_function():
        def f():
            return [1, 2, 3]assert f() == [1, 2, 4]
    

    执行这个测试用例,看下输出的错误信息:

    ============================================================ FAILURES ============================================================
    _________________________________________________________ test_function __________________________________________________________
    ​
        def test_function():
            def f():
                return [1, 2, 3]
        
    >       assert f() == [1, 2, 4]
    E       assert [1, 2, 3] == [1, 2, 4]
    E         At index 2 diff: 3 != 4
    E         Full diff:
    E         - [1, 2, 4]
    E         ?        ^
    E         + [1, 2, 3]
    E         ?        ^
    ​
    tests/test_assertions.py:22: AssertionError
    ​
    

    可以看到,输出信息中包含了函数的返回值,并且显示了返回值与预期结果不一致的元素是index为2的元素。

    4.3 断言集合类型

    断言列表、元组、字典和集合等类型在测试中也是很常见的,对于具有嵌套的集合数据,pytest的assert依然能够精确地显示出来出错的位置。比如下面这段测试用例代码:

    class TestCollections(object):
        def test_dict(self):
            assert {"a": 0, "b": 1, "c": 0} == {"a": 0, "b": 2, "d": 0}def test_dict2(self):
            assert {"a": 0, "b": {"c": 0}} == {"a": 0, "b": {"c": 2}}def test_list(self):
            assert [0, 1, 2] == [0, 1, 3]def test_list2(self):
            assert [0, 1, 2] == [0, 1, [1, 2]]def test_set(self):
            assert {0, 10, 11, 12} == {0, 20, 21}
    

    执行上面的测试代码,核心输出会是下面这样:

    ============================================================ FAILURES ============================================================
    ___________________________________________________ TestCollections.test_dict ____________________________________________________
    ​
    self = <test_assertions.TestCollections object at 0x10b0d2d10>
    ​
        def test_dict(self):
    >       assert {"a": 0, "b": 1, "c": 0} == {"a": 0, "b": 2, "d": 0}
    E       AssertionError: assert {'a': 0, 'b': 1, 'c': 0} == {'a': 0, 'b': 2, 'd': 0}
    E         Omitting 1 identical items, use -vv to show
    E         Differing items:
    E         {'b': 1} != {'b': 2}
    E         Left contains 1 more item:
    E         {'c': 0}
    E         Right contains 1 more item:
    E         {'d': 0}...
    E         
    E         ...Full output truncated (6 lines hidden), use '-vv' to show
    ​
    tests/test_assertions.py:27: AssertionError
    ___________________________________________________ TestCollections.test_dict2 ___________________________________________________
    ​
    self = <test_assertions.TestCollections object at 0x10b0d2a90>
    ​
        def test_dict2(self):
    >       assert {"a": 0, "b": {"c": 0}} == {"a": 0, "b": {"c": 2}}
    E       AssertionError: assert {'a': 0, 'b': {'c': 0}} == {'a': 0, 'b': {'c': 2}}
    E         Omitting 1 identical items, use -vv to show
    E         Differing items:
    E         {'b': {'c': 0}} != {'b': {'c': 2}}
    E         Full diff:
    E         - {'a': 0, 'b': {'c': 2}}
    E         ?                     ^
    E         + {'a': 0, 'b': {'c': 0}}...
    E         
    E         ...Full output truncated (2 lines hidden), use '-vv' to show
    ​
    tests/test_assertions.py:30: AssertionError
    ___________________________________________________ TestCollections.test_list ____________________________________________________
    ​
    self = <test_assertions.TestCollections object at 0x10b0c1190>
    ​
        def test_list(self):
    >       assert [0, 1, 2] == [0, 1, 3]
    E       assert [0, 1, 2] == [0, 1, 3]
    E         At index 2 diff: 2 != 3
    E         Full diff:
    E         - [0, 1, 3]
    E         ?        ^
    E         + [0, 1, 2]
    E         ?        ^
    ​
    tests/test_assertions.py:33: AssertionError
    ___________________________________________________ TestCollections.test_list2 ___________________________________________________
    ​
    self = <test_assertions.TestCollections object at 0x10b0d6c10>
    ​
        def test_list2(self):
    >       assert [0, 1, 2] == [0, 1, [1, 2]]
    E       assert [0, 1, 2] == [0, 1, [1, 2]]
    E         At index 2 diff: 2 != [1, 2]
    E         Full diff:
    E         - [0, 1, [1, 2]]
    E         ?        ----  -
    E         + [0, 1, 2]
    ​
    tests/test_assertions.py:36: AssertionError
    ____________________________________________________ TestCollections.test_set ____________________________________________________
    ​
    self = <test_assertions.TestCollections object at 0x10b0c1a50>
    ​
        def test_set(self):
    >       assert {0, 10, 11, 12} == {0, 20, 21}
    E       AssertionError: assert {0, 10, 11, 12} == {0, 20, 21}
    E         Extra items in the left set:
    E         10
    E         11
    E         12
    E         Extra items in the right set:
    E         20
    E         21...
    E         
    E         ...Full output truncated (4 lines hidden), use '-vv' to show
    ​
    tests/test_assertions.py:39: AssertionError
    

    可以看到对于嵌套的字典和列表,也能显示出不一致数据的具体位置。对于过长的数据,默认是会被truncated,可以通过-vv显示全部信息。

    除了相等断言,还可以进行大于、小于、不等于、in/not in等类型的断言。

    对于对象的断言,可以进行对象的类型断言、对象本身的断言。这里就不在一一举例,只要记住断言是使用assert语句,使用方法与在Python语言中的使用方法完全一致就可以了。

    更多断言的例子,大家可以参考Pytest的官方文档:https://docs.pytest.org/en/latest/example/reportingdemo.html,这里一共有44个断言的例子,非常全面,几乎涵盖了所有的相等断言的场景。

    04 — Pytest断言Excepiton

    除了支持对代码正常运行的结果断言之外,Pytest也能够对Exception和Warnning进行断言,来断定某种条件下,一定会出现某种异常或者警告。在功能测试和集成测试中,这两类断言用的不多,这里简单介绍一下。

    对于异常的断言,Pytest的语法是:with pytest.raises(异常类型),可以看下面的这个例子:

    def test_zero_division():
        with pytest.raises(ZeroDivisionError):
            1 / 0
    

    这个测试用例断言运算表达式1除以0会产生ZeroDivisionError异常。除了对异常类型进行断言,还可以对异常信息进行断言,比如:

    def test_zero_division():
        with pytest.raises(ZeroDivisionError) as excinfo:
            1 / 0
        assert 'division by zero' in str(excinfo.value)
    

    这个测试用例,就断言了excinfo.value的内容中包含division by zero这个字符串,这在需要断言具体的异常信息时非常有用。

    对于Warnning的断言,其实与Exception的断言的用法基本一致。这里就不介绍了,关于更多的Exception和Warnning的断言可以参考Pytest的官方文档https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions

    05 — 为断言添加自定义功能

    通过前面的介绍,感觉Pytest的assert挺完美了,又简单又清晰。但是在实际的测试工作中,还会遇到一些实际问题,比如在断言时,最好【自动】添加一些日志,避免我们在测试代码中手动加入日志。还有,最好能将断言的信息,【自动】集成到一些测试报告中,比如Allure中(关于Allure报告大家可以看之前的文章《用Pytest+Allure生成漂亮的HTML图形化测试报告》)。这样就能避免在每一个测试脚本中手动写很多重复的代码,从而让我们将更多的时间和精力放到编写测试用例上。

    有了这样的想法,接下来看看如何实现。

    Pytest中提供了一个Hook函数pytest_assertrepr_compare,这个函数会在测试脚本的assert语句执行时被调用。因此,可以实现这个函数,在函数中添加写日志和集成allure测试报告代码。

    完整的代码如下所示:

    # content of conftest.py
    def pytest_assertrepr_compare(config, op, left, right):
        left_name, right_name = inspect.stack()[7].code_context[0].lstrip().lstrip('assert').rstrip('\n').split(op)
        pytest_output = assertrepr_compare(config, op, left, right)
        logging.debug("{0} is\n {1}".format(left_name, left))
        logging.debug("{0} is\n {1}".format(right_name, right))
        with allure.step("校验结果"):
            allure.attach(str(left), left_name)
            allure.attach(str(right), right_name)
        return pytest_output
    

    通过inspect获取调用栈信息,从中得到测试脚本中assert语句中op操作符两边的字符串名称,在日志和测试报告中会用到。接着执行assertrepr_compare输出错误详细信息,这些信息就是在执行断言失败时的输出内容,pytest_assertrepr_compare函数没有对其做任何修改。接着添加了debug日志输出和allure测试报告的内容,最后再将assert的错误信息返回给调用处。

    实现了这个函数后,测试脚本不需要做任何修改,依然是直接使用assert进行断言。但是能够自动记录日志和生成allure测试报告了。

    06 — 禁止Pytest的assert特性

    如果不想要Pytest中的assert的效果,而是希望保持Python原生的assert效果,只需要在执行测试是指定一个选项:

    --assert=plain
    

    这样所有测试用例中的assert都变成了Python原生的assert效果了,如果只想某一个模块保持Python原生的assert效果,那么就在对应模块的docstring中添加PYTEST_DONT_REWRITE字符串就好了,也就是在py文件的最上面添加类似下面的docstring内容:

    """
    Disable rewriting for a specific module by adding the string:
    PYTEST_DONT_REWRITE
    """
    

    不过,我想应该没有人会这么干,因为Pytest的assert还是更好用一些。

    07 — 总结

    本文对比了Python原生的assert与Pytest中的assert的区别,详细介绍了Pytest中assert的用法,并根据测试工作的实际需求,演示了如何通过pytest_assertrepr_compare这个Hook函数在断言时增加日志和报告输出。希望对你有帮助。

    参考资料

    [1] https://morioh.com/tutorials

    [2] https://docs.pytest.org/en/latest/example/reportingdemo

    在这里插入图片描述

    展开全文
  • 摘要:最近进行自动化测试,经常使用断言,在此总结一些unittest的TestCase类提供的常用assert方法。 具体: 方法检查新的 assertEqual(a,b) a==b assertNotEqual(a,b) a!=b ...

    开发环境:appium Android python

    摘要:最近进行自动化测试,经常使用断言,在此总结一些unittest的TestCase类提供的常用assert方法。

    具体:

    方法检查新的
    assertEqual(a, b)== b 
    assertNotEqual(a, b)!= b 
    assertTrue(x)bool(x) 是 True 
    assertFalse(x)bool(x) 是 False 
    assertIs(a, b)是 b3.1
    assertIsNot(a, b)是 不是 b3.1
    assertIsNone(x)是 3.1
    assertIsNotNone(x)是 不是 3.1
    assertIn(a, b)在 b3.1
    assertNotIn(a, b)不是 在 b3.1
    assertIsInstance(a, b)isinstance(a, b)3.2
    assertNotIsInstance(a, b)不是 isinstance(a, b)3.2

     

     

     

     

     

     

     

     

     

     

    assert方法都接受一个msg参数,如果指定,则用作失败时的错误消息(参见longMessage)。

    1.assertEqual(first,second,msg=None)

      该方法是测试first和second是否相等。如果值不相等,测试将失败。

      此外,first与second是完全相同的类型以及list,tuple,dict,set,frozenset或str或子类注册addTypeEqualityFunc()将调用类型特定的相等函数,以生成更有用的默认错误消息。  

      在版本3.1中已更改:添加了类型特定的相等函数的自动调用。

      在版本3.2中更改: assertMultiLineEqual()添加为用于比较字符串的默认类型相等函数

    2.assertNotEqual(first,second,msg=None)

      该方法是测试first与second不相等,如果值相等,测试将失败。

    3.assertTrue(expr,msg=None)和assertFalse(expr,msg=None)

      测试expr是true(或false)但当有更具体的方法可以使用时,应避免使用这种方法,例如,assertEqual(a,b)可判断a与b是否相等时,应使用assertEqual()方法,而不是assertTrue(a==b)因为他们在出现故障时提供更好的错误信息。

    4.assertIsNone(expr,msg=None)和assertIsNotNone(expr,msg=None)

      测试expr是不是无,这个是版本3.1的新功能。

    5.assertIn(first,second,msg=None)和assertNotIn(first,second,msg=None

      测试first是否在second

    6.assertIsInstance(obj,cls,msg=None)和assertNotIsInstance(obj,cls,msg=None)

      测试obj是不是cls的实例(它可以是类或类的元组,如isinstance() 支持。检查具体类型使用assertIs(type(obj),cls))

      该方法是版本3.2中的新功能

    转载于:https://www.cnblogs.com/caolicong/p/8434805.html

    展开全文
  • 为了使自动化测试代码的结果验证更加准确,一般会加入断言,来判断结果是真还是假。断言就是判断实际结果是否跟预期结果一致,如果不一致的话,测试用例则执行失败,便不再往下执行。在自动化测试用例执行结束后,...

     

    1. 前言

           为了使自动化测试代码的结果验证更加准确,一般会加入断言,来判断结果是真还是假。断言就是判断实际结果是否跟预期结果一致,如果不一致的话,测试用例则执行失败,便不再往下执行。在自动化测试用例执行结束后,出现实际结果与预期结果不一致的断言内容,一般也会被加入到测试报告中。

    2. 不同的断言方式

    2.1 常见的断言类型

    断言

    描述

    assertEqual(a, b) 

    判断两个参数a,b是否相等

    assertNotEqual(a, b)

    判断两个参数a,b是否不相等

    assertTrue(a)

    判断a是否为true

    assertFalse(a)

    判断a是否为false

    assertIs(a, b)

    验证a,b是否是同一对象

    assertIsNot(a, b)

    验证a,b是否不是同一对象

    assertIsNone(a)

    验证a是否为None

    assertIsNotNone(a)

    验证a是否不为None

    展开全文
  • 自动化测试的最后一步需要判断结果是否正确,而正确设置断言可以帮助判断测试用例的执行结果,从而提高自动化测试的效率,python unittest 提供了一个比较完整的断言方法。unittest框架测试框架提供的方法比较多,...
  • 自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行操作可能还不够,有时候也需要对预期结果进行判断。 这里介绍几个常用断言的使用方法,可以一定程度上...
  • 10,js在web自动化中的作用展示 11,自动化代码优化 12,selenium对比RF 13,自动化测试脚本三种等待 14,PO模式 六、HTTP协议 1,HTTP协议特点: 2,HTTP传输原理 3,get和post的区别 4,HTTP响应代码 5,osi七层模型...
  • 在本系列的第一篇文章“我们的测试为什么不够敏捷”中,根据实例总结出敏捷自动化测试的两大阻碍:“脚本维护困难”、“断言条件繁琐”。本文针对在不失自动化测试有效性的前提下如何降低断言成本来分享一些实践经验...
  • 上一篇文章《在接口自动化测试中,如何利用Pytest + JSON Schema 进行接口响应断言》中,介绍了JSON Schema校验接口响应的数据结构的方法。在实际的测试工作中,很多时候是需要对接口的响应数值进行校验的。这时候就...
  • 自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行操作可能还不够,有时候也需要对预期结果进行判断。 这里介绍几个常用断言的使用方法,可以一定程度上...
  • 断言定义 熟悉单元测试的同学都知道在测试用例中,执行完测试用例后,通过断言(assert)判断测试结果是pass还是fail。不同的单元测试框架都提供了断言机制,我们这里以python为例进行说明。Python中的断言类型丰富...
  • 接口自动化总结

    千次阅读 2018-02-07 13:09:18
     对半年多来的接口自动化测试工作做一个总结,同时也希望能够有志同道合的朋友一起交流,本文中仅贴出了接口框架里面部 分代码,更多的是希望有朋友一起讨论下接口框架的实现思路、应有的功能、可维护性等。 ...
  • jemeter参数化断言

    2019-07-05 20:23:01
    2.下面总结两种参数化请求和参数化断言的方式 一.参数化断言 下图参数化参数:username,password 下图:断言时直接取参数即可 有几行数据,循环参数设置几,然后断言时也会自动循环去取参数 ...
  • 总结: 常用 assertEqual(a, b) assertNotEqual(a, b) assertTrue(x) assertFalse(x) assertIs(a, b) assertIsNot(a, b) assertIsNone(x) assertIsNotNone(x) assertIn(a, b) ...
  • jmeter beanshell断言接口自动化实例

    万次阅读 2018-07-30 10:38:03
    相较针对公司产品特性自主开发一套接口测试自动化框架,用JMeter实现接口测试无需具备非常专业的编码能力(对于像我这样的码渣而言是极好的 ),并且成本也要低的多, 很适合现如今国内各大互联网公司流行的敏捷开发...
  • 1.json 和字典的区别? json 本质上还是字符串,只是按 key:value 这种键值对的格式来的字符串, json和python中的字典的相互转化可参考下边文章 json和字典的相互转化 ...自动化测试中,测试数据如何管理? ...
  • web自动化测试终篇(28):总结我理解的ui自动化

    千次阅读 多人点赞 2019-05-04 23:05:13
    自动化测试最大的挑战就是需求的变化,而自动化脚本本身就需要修改、扩展、debug,去适应新的功能,如果投入产出比太低,那么自动化测试也失去了其价值和意义; 折中的做法是选择相对稳定的模块和功能进行自动化...
  • 02 — 自动化测试中如何断言自动化测试中,如何通过代码方式对JSON格式的Response进行JSON Schema断言呢?因为我平时都是用Python进行自动化测试的,今天就来介绍一下python语言中JSON Schema断言的方式。 需要...
  • Python+Requests+Pytest 接口自动化测试脚本总结

    万次阅读 多人点赞 2020-04-07 14:28:05
    在python脚本中调用pytest 四、重构接口自动化测试框架 一、框架搭建流程 1. 封装接口请求 封装post和get方法方便在使用requests模块发送请求时,仅调用一个方法即可 #!/usr/bin/env python # -*- coding:utf-8 -*-...
  • android 自动化测试学习总结

    千次阅读 2012-07-05 16:18:24
     最近几天了解了下android自动化测试相关的知识。  以下对几种测试工具的介绍摘自网络:  现在,已经有大量的Android自动化测试架构或工具可供我们使用,其中包括:Activity Instrumentation,...
  • 使用断言可以省去我们人工校对结果的时间,断言结合Postman自动化测试可以帮助我们非常块地测完所有用例。 1.单接口测试使用断言: 使用前面发送一条请求用到的接口,添加断言如图4-1: 图4-1 图4-1标注说
  • junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类。 1.assertTrue/False([String message,]boolean condition);  判断一个条件是true还是false。感觉这个最好用了,不用记下来那么多的...
  • 1. 什么是BDD BDD全称Behavior Driven Development,译作"行为驱动开发"...BDD可以让项目成员(甚至是不懂编程的)使用自然语言来描述系统功能和场景,从而根据这些描述步骤进行系统自动化的测试...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,159
精华内容 6,863
关键字:

自动化断言作用总结