精华内容
下载资源
问答
  • Python + selenium 测试自动化 断言 断言作用是对结果进行判断 当结果符合我们预期时 就会报pass self.assertEqual(a,b) 判断a是否等于b self.assertln(a,b) 判断b是否包含a self。assertTrue(a) 判断a是否是Ture ...

    Python + selenium 测试自动化

    断言

    断言的作用是对结果进行判断 当结果符合我们预期时 就会报pass

    self.assertEqual(a,b)    判断a是否等于b
    self.assertln(a,b)       判断b是否包含a
    self。assertTrue(a)      判断a是否是Ture
    

    以上是我对断言的简单的用法总结
    有需要了解更多断言知识的可以打开以下网页查阅学习前辈们的断言知识

    基本定位

    1. 需要先跳转到需要定位的网址页面
    2. 按F12
    3. 点击以下的按钮
      点击以下的按钮
      4.将鼠标移动到需要定位的位置 点击 下面的前端代码就会自动跳转到定位的代码位置

    Xpath定位

    当遇到项目工程量很大时 不断的去人工定位是一件非常耗时耗神的事情 以下提供一种快速拷贝Xpath定位的方法 按情况去使用(因为有时候python解释器识别不出来 当然这是少部分的时候)

    1. 需要先跳转到需要定位的网址页面

    2. 按F12

    3. 找到定位的位置 右键 点击copy 点击copy Xpath找到定位的位置  右键  点击copy 点击copy Xpath

    4. 直接在粘贴下来就可以得到需要的位置的Xpath定位了

    悬停类

    当我们遇到需要点击的元素需要将鼠标移动悬停在上面会展开时 就需要悬停类进行定位点击了

    from selenium.webdriver.common.action_chains import ActionChains#使用悬停方法需要包含该包
    copy = driver.find_element_by_xpath("***")#将悬停的地方的定位给变量copy
    ActionChains(driver).move_to_element(copy).perform()#移动到悬停所在的元素上
    driver.find_element_by_xpath("***").click#对悬停元素进行点击
    

    下拉框

    下拉框和悬停的区别在于 下拉框需要点击才会扩展出里面的元素 而悬停类不用 只需要将鼠标悬停在上方就可以扩展出

    from selenium.webdriver.support.select import Select#使用该方法需要包含该包
    copy = driver.find_element_by_xpath("***")#将需要点击的下拉框的定位给变量copy
    有三种方法都可以进行选择:
    
     1. Select(copy).select_by_index(*)#通过索引定位 *号的意思是选择第几个元素
     
     2. Select(copy).select_by_value("**")#通过value属性进行选择 **号里选择value属性的值  通常从0开始计数
     
     3.  Select(copy).select_by_visible_text("**")#通过文本来进行选择  **号里填入选择的元素文本名字
    

    多窗口

    当我们在写自动化脚本时遇到多窗口时 因为代码并不会自动的切换窗口 所以我们需要进行切换窗口进行操作

    windowsAll = driver.window_handles#获取所有的窗口
    driver.swtich_to.window(windowsAll[1])#切换到第2个窗口  windowsAll[*]从0开始计数
    

    警告框

    当我们在点击时 有时会出现警告框 想要定位到警告框的元素有2种方式:

    1. HTML实现的警告框(可以直接通过元素定位器进行定位)
    driver.find_element_by_xpath("***")
    
    1. Javascript实现的警告框(无法直接元素定位 需要使用特殊的方法进行定位)
    switch_to.alert.accpet()#确认
    switch_to.alert.dismiss()#取消
    switch_to.alert.text#获取警告框上的文本信息
    

    readonly属性(只可读不可改属性)

    当我们遇到readonly属性时 就需要移除readonly属性才可以进行修改

    js_readonly = 'document.getElementById("***").removeAttribute("***")'#将readonly属性的位置定位给变量js_readonly
    driver.execute_script(js_readonly)#移除readonly属性  但只有效移除我们操作的这一次
    #接下来就可以对该元素进行操作
    

    小技巧: 我们可以通过控制台将document.getElementById("***").removeAttribute("***")联想补充 这样方便我们打代码不会打错 具体操作如下:

    1. 按F12
    2. 点击该处 在下面将代码补充后 复制粘贴到我们的代码里点击该处  在下面将代码补充后  复制粘贴到我们的代码里

    如果对你有帮助就点个赞叭~ 哪里有错误多多希望可以评论告诉我 谢谢

    展开全文
  • 才发现自动化测试有很多好处。测试最重要的自然是提升代码质量。代码有测试用例,虽不能说百分百无bug,但至少说明测试用例覆盖到的场景是没有问题的。有测试用例,发布前跑一下,可以杜绝...
  • 初识postman接口测试总结

    千次阅读 2018-08-03 15:03:32
    接口测试的原理:你发送数据,看返回数据是否正确,返回值类型是否正常,...注意:Postman是不适合自动化测试的,它所能提供的是半自动化测试,断言只是提供了简单的自动化检查,还是需要人工介入测试的 二、集合 ...

    接口测试的原理:你发送数据,看返回数据是否正确,返回值类型是否正常,主要点是多种数据的,返回结果正常

    一、断言

    判断预期结果和实际结果是否一致。

    作用:便于重复跑接口测试用例;只需要看最终的结果是否通过即可。

    postman提供了一些常用的断言。

    注意:Postman是不适合自动化测试的,它所能提供的是半自动化测试,断言只是提供了简单的自动化检查,还是需要人工介入测试的

    二、集合

    作用:将测试用例放在一个集合中,批量运行一组测试用例。

    postman不支持跑集合中特定的几个用例,也不支持禁用集合中的某个用例(jmeter可以实现禁用用例)

     

    三、cookie管理

    参考博客:https://blog.csdn.net/loner_fang/article/details/81362261

    如果有登录接口的话,后续就不用再配置cookies,原理是

    1>用户首先进行登录,如登录成功的话,后台会生成一个唯一的sessionId,并在后台存储对应的用户信息 (redis,数据库等等),并将sessionId写到Cookie。

    2>下次该ip访问时,会首先判断Cookie,进而确定该用户是否进行了登录操作。

     

    四、参数化(数据驱动)

    postman提供了3中参数化文件格式。分别为txt、csv、json格式。

    要实现参数化需要在请求发起之前配置。

    ///读取文件中的参数,设置成环境变量  data不是文件名,是固定写法
    pm.environment.set("username", data.username);
    pm.environment.set("password", data.password);

     

    五、关联

    参数传递:上一个接口的出参是下一个接口的入参

    var JsonData = json.parse(responseBody)   # 将接口返回的数据转换成json对象
    pm.environment.set(‘变量名’,JsonData.name)   # 将接口返回的name值设置为环境变量,供下一个接口调用。

    下一个接口直接使用{{变量名}}调用即可。(Postman里面获取变量的语法为:{{变量名}}

     

    六、配置环境变量:测试环境、预生产环境、线上环境

    需求是测试环境、预生产环境、线上环境均要做接口测试。

    测试 URL 进行定义成变量的形式,这样随着域名怎么变,URL 就不用变更。

    因为不同的环境主机会不同,假设测试环境有15个接口需要测试,直接使用url的话就需要新建45个接口用例来分别测试;可如果使用环境变量来实现只需要切换下环境变量即可,只需要写15个接口用例。

    新建两套测试环境集,预生产环境和线上环境,里面分别配置baseurl,值填写预生产环境的域名和线上环境的域名。

    选择哪套环境变量集,就使用哪套环境变量集里的url值

     

    三、全局变量与环境变量的区别

    环境变量可以有多组,但全局变量只有一组,作用于全部用例;

    环境变量的优先级高于全局变量,如果全局变量和环境变量中都设置了baseurl,在选择了环境变量的前提下,会使用环境变量,全局变量此时失效。

    变量优先级:数据变量(数据驱动)>环境变量>全局变量

     

    七、postman测试导出excel时,响应的内容是一堆乱码  �(编码问题)

    取决于后端返回的是什么。后端是以文件流的形式返回的,postman编译不了文件流,所以rbody中返回的是乱码。

    这种情况可以直接在浏览器上下载测试。(浏览器会解析文件流并编译)

     

    八、Json相关知识

    Json通常用于与服务器交换数据。

    json字符串与json对象

     

    Json字符串

    Json对象

    定义

    var str1 = '{ "name": "zxf", "sex": "woman" }';

    var str2 = { "name": "zxf", "sex": "woman" };

    调用

    Json字符串就是字符串,无法调用,需要转换成json对象

    Json对象可以通过xx.name来调用

    传输

    在数据传输的过程中,json是以字符串的形式传递的

     

    Js操作

     

    Js操作的是json对象

    前端在接收服务器数据时,一般是json字符串。前端在处理后端返回的数据前需要先将json字符串转换成json对象。

    前后端会规定好接收的是json字符串还是json对象。

     

    九、要运用好postman,还需要有JavaScript的基础

    嗯,反正我没有,呜呜呜,加油

     

    十、接口测试用例设计

     

    在使用postman时要学会灵活应用。像postman本身是不提供禁用集合中的单个用例的,这时候可以将暂时不需要的用例移入一个空的集合中即可。还有postman不支持文件参数的循环引用,这时候可以考虑复制参数来实现该功能。

    展开全文
  • 自动化测试软件作用(重点): 一:jmeter:纯java编写负载功能测试和性能测试开源工具, 支持接口自动化测试,录制、抓包、可进行压力测试(增加线程,考验服务器最大支持访问数)、弱网测试、添加请求、添加断言...

    自动化测试软件作用(重点):

    一:jmeter: 纯java编写负载功能测试和性能测试开源工具, 支持接口自动化测试,录制、抓包、可进行压力测试(增加线程,考验服务器最大支持访问数)、弱网测试、添加请求、添加断言,查看断言、结果树,聚合报告,分析测试报告等

    聚合报告参数详解: 
    1. Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 
    2. Samples:请求数——表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100 
    3. Average:平均响应时间——默认情况下是单个 Request 的平均响应时间
    4. Median:中位数,也就是 50% 用户的响应时间 
    5. 90% Line:90% 用户的响应时间 
    6. Min:最小响应时间 
    7. Max:最大响应时间 
    8. Error%:错误率——错误请求数/请求总数 
    9. Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second)
    10. KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec

     

    二:ant: 将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,并生成测试报告并发送

     

    三:jenkins: Jenkins是一个开源CI服务器,基于Web访问,jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性,拥有大量的插件:这些插件极大的扩展了Jenkins的功能,持续集成工具,所有工作都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间和工作量;

     

    四:monkey:它是Android SDK系统自带一个命令行工具,可以运行在模拟器里或者真是设备中运行。向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行稳定性测试。

     

    五:charles: 1.抓包(http、https):设置手机HTTP代理、https  charles也需要证书

    2.弱网测试:通过Throttle Settings(网络控制)、Enable Throttling(启用设置)、Throttle preset(通过预设网络值来拟定网络)、设置网络带宽值等

    3.网络请求的截取并动态修改:

    4.压力测试:通过右键点击链接,Repeat Advanced(重复),选择Iterations(重复次数)Concurrency(并发数)

    5.数据替换:通过链接右键点击Map Local(本地位置)进入设置,选择替换数据文件,替换即可

     

    六:selenium :web自动化测试框架(测试浏览器兼容性的自动化)selenium不支持桌面软件自动化测试。软件测试报告,和用例管理只能依赖第三方插件unittest优点:兼容更多的平台( Windows、Linux 、 Macintosh等)以及浏览器(火狐,IE,谷歌等)

    定位元素方式:id、name、class_name、tagname、link_text、partial_link_text、xpath、css_selector

    强制等待:sleep()强制等待,不管你浏览器是否加载完,程序都得等待

    显示等待:WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了.它主要的意思就是:程序每隔多久查看一次,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException

    隐式等待:implicitly_wait(),整个driver周期有效,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止

     

    七:appium:开源测试自动化框架,可用于原生,混合和移动Web应用程序测试

    两大组件:

    一:Appium Server就是Appium的服务端——一个web接口服务,使用Node.js实现。

    二:Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,提供Appium自动化服务器的强大功能。

    Appium GUI是Appium desktop的前身。 也就是把Appium server封装成了一个图形界面,降低了使用门槛。

    因为Appium是一个C/S结构,有了服务端的肯定还有客户端,Appium Clients就是客户端,它会给服务端Appium Server发送请求会话来执行自动化任务。

    Appium-desktop主界面包含三个菜单:

    Simple

    • host:设置Appium server的ip地址,本地调试可以将ip地址修改为127.0.0.1
    • port:设置端口号,默认是4723不用修改
    • start server:启动 Appium server

    Advanced:高级参数配置修改,主要是Android和iOS设备,log路径等相关信息的配置。

    Presets:将Advanced中的一些配置信息作为预设配置。
     

     

    八:pytest:pytest是一个全功能的Python测试框架,

    优点:

    • 1、简单灵活,容易上手,文档丰富;
    • 2、支持参数化,可以细粒度地控制要测试的测试用例;
    • 3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
    • 4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
    • 5、测试用例的skip和xfail处理;
    • 6、可以很好的和CI工具结合,例如jenkins

    编写规则:

    • 测试文件以test_开头(以_test结尾也可以)
    • 测试类以Test开头,并且不能带有 init 方法
    • 测试函数以test_开头
    • 断言使用基本的assert即可
    # -*- coding:utf-8 -*-
    import pytest
    
    @pytest.fixture(scope='function')
    def setup_function(request):
        def teardown_function():
            print("teardown_function called.")
        request.addfinalizer(teardown_function)  # 此内嵌函数做teardown工作
        print('setup_function called.')
    
    @pytest.fixture(scope='module')
    def setup_module(request):
        def teardown_module():
            print("teardown_module called.")
        request.addfinalizer(teardown_module)
        print('setup_module called.')
    
    @pytest.mark.website
    def test_1(setup_function):
        print('Test_1 called.')
    
    def test_2(setup_module):
        print('Test_2 called.')
    
    def test_3(setup_module):
        print('Test_3 called.')
        assert 2==1+1              # 通过assert断言确认测试结果是否符合预期

    fixture的scope参数

    scope参数有四种,分别是'function','module','class','session',默认为function。

    • function:每个test都运行,默认是function的scope
    • class:每个class的所有test只运行一次
    • module:每个module的所有test只运行一次
    • session:每个session只运行一次

    setup和teardown操作

    • setup,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等
    • teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等
    • 备注:也可以通过在fixture函数中通过yield实现setup和teardown功能

     

    九:unitest: unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果

    unittest.TestCase:TestCase类,所有测试用例类继承的基本类:       class BaiduTest(unittest.TestCase)

    unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法并自动执行他们。

    unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。

    unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例。

    unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

    unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

    TestCase类的属性:

    setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。

    tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。

    assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

    TestSuite类的属性:

    addTest(): addTest()方法是将测试用例添加到测试套件中,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。   suite = unittest.TestSuite()                  suite.addTest(test_baidu.BaiduTest('test_baidu'))

    TextTextRunner的属性:

    run(): run()方法是运行测试套件的测试用例,入参为suite测试套件:    runner = unittest.TextTestRunner() runner.run(suite)

     

    微信朋友圈测试用例:

    这里写图片描述

     

    关系型数据库:

    • 关系型数据库是依据关系模型来创建的数据库。
    • 所谓关系模型就是“一对一、一对多、多对多”等关系模型,关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
    • 关系型数据可以很好地存储一些关系模型的数据,比如一个老师对应多个学生的数据(“多对多”),一本书对应多个作者(“一对多”),一本书对应一个出版日期(“一对一”)
    • 关系模型是我们生活中能经常遇见的模型,存储这类数据一般用关系型数据库
    • 关系模型包括数据结构(数据存储的问题,二维表)、操作指令集合(SQL语句)、完整性约束(表内数据约束、表与表之间的约束)。
    • 常见的关系型数据库Oracle、MySQL、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access
    • 关系型数据库的特点:安全(因为存储在磁盘中,不会说突然断电数据就没有了)、容易理解(建立在关系模型上)、

      但不节省空间(因为建立在关系模型上,就要遵循某些规则,好比数据中某字段值即使为空仍要分配空间)

    非关系型数据库:

    非关系型数据库主要是基于“非关系模型”的数据库(由于关系型太大,所以一般用“非关系型”来表示其他类型的数据库)

    列模型:存储的数据是一列列的。关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)

    键值对模型:存储的数据是一个个“键值对”,比如name:liming,那么name这个键里面存的值就是liming

    常见非关系模型数据库:列模型:Hbase、键值对模型:redis,MemcacheDB、文档类模型:mongoDB

    非关系型数据库的特点:效率高(因为存储在内存中)、但不安全(断电丢失数据,但其中redis可以同步数据到磁盘中),现在很多非关系型数据库都开始支持转存到磁盘中。

     

    MySQL外连接、内连接的区别?

    left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
    right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
    inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。内连接是交集
    full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。外连接是并集union

    多表联查-- 2.查询科目为java的最高成绩的学生名字和编号

    SELECT stu1.sname,stu1.sid,i.subname,MAX(i.cj) FROM (SELECT stu3.subname,stu2.sid,stu2.cj FROM stu3 INNER JOIN stu2 ON stu3.subid = stu2.subid WHERE subname LIKE "java") i INNER JOIN stu1 ON i.sid = stu1.sid

    +-----+------+------+-------+------------+--------------+--------+-------+
    多表联查-- 3.查询名字为李四的所有科目总成绩

    SELECT stu1.sname,SUM(stu2.cj) FROM  stu1 INNER JOIN stu2 ON stu1.sid = stu2.sid where sname LIKE "李四"
     

    数据库常用方法:

    增:Insert  into 表名 value 值

    删:Delect from 表名  where  值

    改:Update 表名 set 字段=字段 where 字段;

    查:Select * from 表名

    自增  auto_increment       
    主键  primary key
    非空  not null
    唯一 unique
    默认值  default
    外键  foreign key 

    查看所有的表  SHOW TABLES ;

    创建一个表  CREATE TABLE n(id INT, name VARCHAR(10));

    # 添加字段: Alter table 表名 add 字段名 数据类型Alter table n ADD age VARCHAR(2) ;

    # 删除字段: Alter table 表名 drop 字段名

    # 更改字段属性和属性:Alter table n CHANGE age a INT;

    # 只更改字段属性:Alter table n MODIFY age VARCHAR(7) ;

    增加数据  INSERT INTO n VALUES (1, 'tom', '23'), (2, 'john', '22');

    删除数据:DELETE FROM n WHERE id = 2;

    更改数据:UPDATE n SET name = 'tom' WHERE id = 2;

    数据查找 : SELECT * FROM n WHERE name LIKE '%h%';

    数据排序(order by)(反序) :Select * from 表名 order by stu_age asc/desc

    分组查询(group by):Select * from 表名 group by sex  =‘男’

    总 数(count)    SELECT count(id) AS total FROM n;

    总 和(sum)    SELECT sum(age) AS all_age FROM n;

    平均值(avg)   SELECT avg(age) AS all_age FROM n;

    最大值(max)   SELECT max(age) AS all_age FROM n;

    最小值(min)   SELECT min(age) AS all_age FROM n;


     

     

    Linux:

    如何杀死一个进程:1.先查找进程号:ps -ef | grep 进程(例如:tomcat)    2.杀死进程:kill -9 进程号

    查看进程和端口号的使用情况:netstat -tunlp|grep

    查看端口号被占用:netstat -anp | grep 端口号     查看是start状态还是stop状态

    查看内存cat /proc/meminfo

    查看cpu:cat /proc/cpuinfo

     

    进入根目录:cd/

    返回上层:cd..

    更新:source  

    显示工作路径:pwd      

    查看目录中的文件 :ls                

    编辑:vi       

    编辑保存:wq         

    删除目录:rmdir

    创建目录:mkdir 

    查找文件:find

    解压:tar -vxzf     

    显示当前进程:ps

     

     

     

    如何通过子元素定位父元素:1.可以使用..代表的是父节点  2.可以使用parent来定位父类元素

     

    Android手机和IOS手机,系统有什么区别?
    1、两者运行机制不同:IOS采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。
    2、两者后台制度不同:IOS中任何第三方程序都不能在后台运行;安卓中任何程序都能在后台运行,直到没有内存才会关闭。
    3、IOS中用于UI指令权限最高,安卓中数据处理指令权限最高。

    Android:一:兼容性测试,Android 从4.0版本的手机测试到9.0版本手机。二:各大品牌的手机都的进行测试,比如:小米小米9 小米8 小米7 小米6 note 红米系列 7红米5,华为: 华为mate20 华为mate10,华为荣耀: 荣耀10,9,8 ,vivo: x21,27,23,oppo: R7,R9,R11,三星手机: note9, 8,7 S9,8。三:稳定性测试: 使用monkey命令进行稳定性测试

    ios:兼容性测试:ios版本测试从9-12,手机型号从4S测试到xmax

    web端测试:兼容性测试:IE浏览器7-12,火狐浏览器 35-最新的,谷歌浏览器,(http、https)

     

    不可逆操作如何处理:如删除订单:

    1.假删除(修改删除标识即可)

    2.真删除就真的删除了,为不可恢复状态,除非再新建订单重新执行流程

     

    在测试中,上下游接口有数据依赖如何处理(下个接口用到上个接口的数据

    1.使用静态值,给定一个符合条件的死数据

    2.或者从数据库中直接获取数据

     

    软件的生命周期:1.产品收集市场需求,2.需求分析,3.产品设计需求,4.UI界面设计,5.前后台开发,设计数据库表、框架,编码,6.版本测试,7.产品上线,8.产品运营

     

     

     

    展开全文
  • BUAAOO第三单元总结

    2019-09-27 16:28:09
    Java Modeling Language (JML)是一种接口行为规格描述语言,使用它我们可以快速建模接口行为,同时借助各种工具实现一些自动化的检查,确保程序各部分符合功能需求。 基本使用: 对接口的前置条件、后置条件及副作用...

    JML及其工具链

    JML发展概述及语法回顾

    Java Modeling Language (JML)是一种接口行为规格描述语言,使用它我们可以快速建模接口行为,同时借助各种工具实现一些自动化的检查,确保程序各部分符合功能需求。

    基本使用:

    对接口的前置条件、后置条件及副作用进行断言式描述

    requires pre-cond...  // 前置条件
    ensures post-cond... // 后置条件
    signals ...          // 抛出异常

    使规格描述与预期的接口行为等价,则当接口的某个实现不符合规格时,可以借助JML检查工具快速发现并修复该实现

    工具链

    参考 http://www.eecs.ucf.edu/~leavens/JML//download.shtml

    The AspectJML tool is able to specify and do runtime assertion checking for both Java and AspectJ programs. Ajmlc uses aspect-oriented compilation techniques to provide significantly improved runtime assertion violation messages, and also works with JavaME.

    AspectJML是一个为Java和AspectJ提供运行时断言检测的工具,支持一些面向切面编程的高级特性

    The jml4c tool is a JML compiler built on the Eclipse Java compiler. It translates a significant subset of JML specifications into runtime checks. Notable features of JML4c include (1) support for Java 5 features such as generics and enhanced for loops, (2) support >for nested classes, (3) improved compilation speed, and (4) improved error messages. Using JML4c, one can now verify Java 5 classes annotated with JML specifications.

    jml4c是一个基于Eclipse Java编译器的JML编译器,它可以将一部分JML规格翻译为运行时检查

    Sireum/Kiasan for Java, which is a JML contract-based automatic verification and test case generation tool-set for Java program units.

    Sireum/Kiasan是契约式的Java测试样例生成工具

    JMLEclipse, which is a pre-alpha version of the JML tool-suite developed on top of Eclipse's JDT compiler infrastructure.

    JMLEclipse是JML在Eclipse中的支持组件,目前仍处在开发阶段

    JMLUnitNG is an automated unit test generation tool for JML-annotated Java code, including code using Java 1.5+ features such as generics, enumerated types, and enhanced for loops. Like the original JMLUnit, it uses JML assertions as test oracles. It >improves upon the original JMLUnit by allowing easy customization of data to be used for each method parameter of a class under test, as well as by using Java reflection to automatically generate test data of non-primitive types.

    JMLUnitNG是一个针对JML自动化生成单元测试的工具,它支持Java5之后的高级语法特性,基于反射等特性为JML的检查提供语言层面和数据层面的易定制的扩展

    JMLOK is a tool that uses random tests to check Java code against JML specifications and suggest likely causes for non-conformance problems it finds.

    JMLOK是一个使用随机数据对JML规格进行检测的工具


    尝试使用JMLUnitNG自动生成测试样例

    对于如下测试代码:

    package adder;
    
    public class Adder {
        /*@ public normal_behaviour
          @ ensures \result == a + b;
        */
        public static int add(int a, int b) {
            return a + b;
        }
    }

    运行:

    java -jar jmlunitng.jar adder\Adder.java

    生成测试文件,编译:

    javac -cp jmlunitng.jar adder\*.java
    java -jar openjml.jar -rac adder/adder.java

    运行:

    java -cp jmlunitng.jar adder.Adder_JML_Test

    结果如下:

    [TestNG] Running:
      Command line suite
    
    Passed: racEnabled()
    Passed: constructor Adder()
    Failed: static add(-2147483648, -2147483648)
    Passed: static add(0, -2147483648)
    Passed: static add(2147483647, -2147483648)
    Passed: static add(-2147483648, 0)
    Passed: static add(0, 0)
    Passed: static add(2147483647, 0)
    Passed: static add(-2147483648, 2147483647)
    Passed: static add(0, 2147483647)
    Failed: static add(2147483647, 2147483647)
    
    ===============================================
    Command line suite
    Total tests run: 11, Failures: 2, Skips: 0
    ===============================================

    成功检测了算术溢出


    架构梳理

    三次作业中,MyRailSystem - MyGraph - MyPathContainer存在明显的继承层级关系。第三次作业为了引入观察者模式,为MyPathContainer实现了Registerable接口,同时将MyGraph的连通性查询改为并查集维护、bfs部分重新封装为BfsSpSolver,除此之外基本没有其他重构

    第三次作业为了引入几种不同的最短路,抽象了SpSolver接口描述一个最短路计算类的基本行为,并在其上实现了BaseCachedSpSolver这个抽象基类,实现结果缓存、注册观察者等基本行为。再在此基础上实现了BfsSpSolverDijSpSoverl,描述bfs和迪杰斯特拉的基本算法模型,前者替换第二次作业中最短距离的计算部分,后者将用于实现本次的三个变种最短路查询寻求。

    本次的新增三种查询需求我使用的是1+x的拆点做法,参考讨论区https://course.buaaoo.top/assignment/75/discussion/215

    三个问题的共同点是

    1. 边权与方向无关
    2. 从某个源点/汇点到一条path的边权为一个常数
    3. path上两点之间的权为一个常数或权值只与这两点的编号相关

    所以很容易用继承关系实现复用。考虑到需求已固定,出于尽量简化架构规避错误的目的,没有进一步考虑有向图、可变权等更复杂需求的可扩展性。

    类图:1269846-20190522193716350-719207850.png

    注意到SpSolver使用观察者模式将自身注册入图对象,当发生图结构变更时图对象会通知所有已注册的观察者作出响应,在作业里响应的内容主要为清空缓存/将Solver状态标记为已更新

    Bug汇总及测试相关

    自己遇到的bug主要是算法实现方面的。在考虑缓存后对dij的中间结果可以予以保存,即对于起点是v的最短路,只要图结构未发生改变,其至所有结点的最短路可以在有限次运算后全部求出,求解顺序与终点u无关。但是若使用d(v,u)的中间结果计算d(u’,v),则会破坏迪杰斯特拉算法的正确性导致错误。

    互测中遇到的问题主要有:

    1. 不合理使用静态数组造成越界
    2. 使用迪杰斯特拉算法求解最短路时,使用一个固定的大常数作为INF值导致中间运算出现溢出或其他错误

    个人认为这两个问题都是设计时欠缺工程化考虑或对问题边界缺乏分析造成的。


    总结体会

    本单元的主要内容是规格化编程及基于其的一系列实际问题。我认为这是很有启发性的一个单元,在契约式的开发过程中,每个单元模块、接口的功能由规格制定方描述,实现方负责实现功能以满足规格,这样的开发在团队中做到了提高效率与明确功能需求间的平衡。设计架构时,规格制定者不需要太过拘泥于具体的代码细节,只需要借助规格将功能界限描述清除,而实现者可以将目光更多地集中于接口中,而不需要关心代码的其他部分是如何耦合的,只需要满足规格即可满足程序正确运行。
    除此之外,这个单元也让我意识到,好的代码架构不仅可以满足一般的逻辑需求,在应用某些特定算法追求性能时一个好的设计架构依旧能为我们带来效率与质量的收益。

    转载于:https://www.cnblogs.com/MisTariano/p/10904695.html

    展开全文
  • java 面试题 总结

    2009-09-16 08:45:34
     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
  • 答:断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。 9、用预处理指令#define 声明一个常数,用以表明1年中有多少秒...
  • C和指针 清晰版 PDF

    热门讨论 2011-10-31 18:29:15
     16.7.2 断言   16.7.3 环境  16.7.4 执行系统命令  16.7.5 排序和查找   16.8 locale   16.8.1 数值和货币格式  16.8.2 字符串和locale  16.8.3 改变locale的效果   16.9 总结   16.10...
  • c和指针PDF电子书

    热门讨论 2010-05-06 13:18:58
    16.7.2 断言 assert.h 342 16.7.3 环境 stdlib.h 343 16.7.4 执行系统命令 stdlib.h 343 16.7.5 排序和查找 stdlib.h 344 16.8 locale 346 16.8.1 数值和货币格式 locale.h 346 16.8.2 字符串和locale string.h 348 ...
  • C和指针 Pointer on C

    2015-05-08 09:25:32
    16.7.2 断言 16.7.3 环境 16.7.4 执行系统命令 16.7.5 排序和查找 16.8 locale 16.8.1 数值和货币格式 16.8.2 字符串和locale 16.8.3 改变locale的效果 16.9 总结 第17章 经典抽象数据类型 17.1...
  • 综合实战播放音乐设置背景鬼程序协程简介协程传递数据wmv协程编号协程生产者消费者模式office自动化操作wordoffice办公自动化操作exceloffice办公自动化操作outlookoffice办公自动化access开发环境配置访问mdb格式...
  • 正则表达式入门 - 正则表达式的作用 / 元字符 / 转义 / 量词 / 分组 / 零宽断言 /贪婪匹配与惰性匹配懒惰 / 使用re模块实现正则表达式操作(匹配、搜索、替换、捕获) 使用正则表达式 - re模块 / compile函数 / ...
  •  6.4.1 格式操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/r)   6.4.4 unicode字符串操作符(u/u)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...
  • 深入理解Python中文版高清PDF

    热门讨论 2012-09-04 19:37:04
     6.4.1 格式操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/R)   6.4.4 Unicode字符串操作符(u/U)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 ...
  • Python核心编程(中文第二版)

    热门讨论 2009-10-02 12:08:14
     6.4.1 格式操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/R)   6.4.4 Unicode字符串操作符(u/U)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...
  • Python核心编程第二版(中文)

    热门讨论 2015-04-23 16:40:13
    12.8.1 自动载入的模块 12.8.2 阻止属性导入 12.8.3 不区分大小的导入 12.8.4 源代码编码 12.8.5 导入循环 12.8.6 模块执行 12.9 相关模块 12.10 练习 第13章 面向对象编程 13.1 引言 13.2 面向对象编程...
  • Python核心编程第二版

    热门讨论 2009-07-30 17:07:20
     6.4.1 格式操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/R)   6.4.4 Unicode字符串操作符(u/U)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...
  • Visual C++ 2005 入门经典 详细书签版

    热门讨论 2013-02-02 16:39:43
    2.7 了解存储时间和作用域 76 2.7.1 自动变量 77 2.7.2 决定变量声明的位置 79 2.7.3 全局变量 79 2.7.4 静态变量 82 2.8 命名空间 83 2.8.1 声明命名空间 84 2.8.2 多个命名空间 86 2.9 C++/CLI...
  • 2.7 了解存储时间和作用域 76 2.7.1 自动变量 77 2.7.2 决定变量声明的位置 79 2.7.3 全局变量 79 2.7.4 静态变量 82 2.8 命名空间 83 2.8.1 声明命名空间 84 2.8.2 多个命名空间 86 2.9 C++/CLI...
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
    2.7 了解存储时间和作用域 71 2.7.1 自动变量 72 2.7.2 决定变量声明的位置 74 2.7.3 全局变量 74 2.7.4 静态变量 77 2.8 命名空间 78 2.8.1 声明命名空间 79 2.8.2 多个命名空间 80 2.9 C++/CLI编程 81 ...
  • 2.7 了解存储时间和作用域 71 2.7.1 自动变量 72 2.7.2 决定变量声明的位置 74 2.7.3 全局变量 74 2.7.4 静态变量 77 2.8 命名空间 78 2.8.1 声明命名空间 79 2.8.2 多个命名空间 80 2.9 C++/CLI编程 81 ...
  • 2.11 了解存储时间和作用域 74 2.11.1 自动变量 74 2.11.2 决定变量声明的位置 76 2.11.3 全局变量 77 2.11.4 静态变量 80 2.12 名称空间 80 2.12.1 声明名称空间 81 2.12.2 多个名称空间 82 2.13 C++/CLI...
  • 2.11 了解存储时间和作用域 74 2.11.1 自动变量 74 2.11.2 决定变量声明的位置 76 2.11.3 全局变量 77 2.11.4 静态变量 80 2.12 名称空间 80 2.12.1 声明名称空间 81 2.12.2 多个名称空间 82 2.13 C++/CLI...
  • Vuex 源码分析

    2021-01-09 07:05:57
    在 <code>src/store.js</code> 文件中, 先声明了一个局部变量 <code>Vue</code> 来保存Vue 引用, 该变量有如下作用: <ul><li>插件不必将 <code>Vue.js</code> 作为一个依赖打包</li><li>作为避免重复安装的 <code>...
  • 12.4.2认证断言 111 第四部分 Web应用程序安全 112 13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5...
  • 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

自动化断言作用总结