运行时出现错误提示如下:
软件测试基础知识
测试过程
- 制定测试计划。内容主要有测试内容、进度安排、测试所需环境和条件、测试培训安排等
- 编制测试大纲。明确、详尽地规定测试中针对系统的每一项功能或特征所必须完成的基本测试项目和测试完成标准。
- 设计并生成测试用例,产生测试设计说明文档。主要有被测试项目、输入数据、测试过程和预期输出结果等
- 实施测试。
- 生成测试报告。对测试进行概要说明,列出测试结论,指出缺陷和错误,给出建议。
测试策略
有效的软件测试分为4步:单元(模块)测试、集成测试、确认(验收)测试和系统测试
单元测试(白盒测试)
在模块编写完成且无编译错误后进行。侧重于对模块中的内部处理逻辑与数据结构。
单元测试内容
1 模块接口。测试模块的输入参数和形式参数在个数、属性、单位上是否一致;调用其他模块时,所给出的实际参数和被调用模块的形式参数在个数、属性、单位上是否一致;调用标准函数时,所使用的参数在属性、数目和顺序上是否正确;全局变量在各模块中的定义和用法是否一致;输入是否仅改变了形式参数;开/关的语句是否正确;规定的IO格式是否与输入/输出语句一致;在使用文件之前是否已经打开文件或使用文件之后是否已经关闭文件。
2 局部数据结构。变量的说明是否合适;是否使用了尚未赋值或尚未初始化的变量;变量的初始值或默认值是否正确;变量名是否有错。
3 重要的执行路径。发现是否有计算、比较或控制流方面错误。
4 出错处理。好的设计应该能够预测到出错条件并且有对出错处理的路径。
5 边界条件。
集成测试
集成测试有两种方法:一种非增量集成,另一种增量集成
- 增量集成策略
1 自顶向下集成测试。自顶向下集成测试时一种构造软件体系结构的增量方法。模块集成顺序为从主控模块(主程序)开始,沿着控制层逐步向下,以深度优先或广度优先的方式将从属主控模块的模块集成到结构中。
2 自底向上集成测试。自底向上集成测试就是从原子模块(程序结构最底层构件)开始进行构造和测试。
3 回归测试。重新执行已测试过的某些子集,以确保变更没有传播不期望的副作用。
4 冒烟测试。在测试中发现问题,找到了一个Bug,然后开发人员会来修复这个Bug。这时想知道这次修复是否真的解决了程序的Bug,或者是否会对其它模块造成影响,就需要针对此问题进行专门测试,这个过程就被称为Smoke Test。
确认测试
测试集中于用户可见动作和用户可识别的系统输出
- α测试与β测试。
α测试
是由有代表性的最终用户在开发者的场所进行。开发者在用户后面观看,并记录错误和使用问题。β测试
在一个或多个最终用户场所执行。最终用户记录测试过程中遇到的所有问题(现实存在或想象的),并定期报告给开发者。接到问题测试报告后开发人员对软件进行修改,然后准备向用户发布软件产品。
系统测试
系统测试是将已确认的软件、计算机硬件、外设和网络等因素结合在一起,进行信息系统的各种集成测试和确认测试,目的在于通过与系统的需求分析比较,发现所开发的系统与用户需求不符或矛盾的地方。
1 恢复测试。通过各种方式强制地让系统发生故障,并验证能否安装要求从故障中恢复过来,并在规定的时间内开始进行事物处理,而且不对系统造成任何伤害。
2 安全性测试。验证建立在系统内的保护机制是否能够实际保护系统不受非法入侵。测试过程中,测试人员模拟非法入侵者,采用各种方法冲破防线。
3 压力测试。压力测试要求以非正常的数量、频率或容量等方式执行系统。
4 性能测试。测试软件在集成环境中的运行性能。
5 部署测试。在多种运行环境中测试软件。
测试方法
软件测试方法分为静态测试和动态测试。静态测试是指被测试程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。动态测试是指运行程序发现错误,可采用黑盒测试和白盒测试。
黑盒测试
黑盒测试也称功能测试,在完全不考虑软件的内部结构和特征的情况下,测试软件的外部特性。
常用的黑盒测试技术有等价类划分、边界值分析、错误推测和因果图的等。
1 等价类划分。将程序的输入域划分为若干等价类,然后从每个等价类中选取一个代表性数据作为测试用例。
2 边界值分析。输入的边界比中间值更加容易发生错误。
3 错误推测。基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例。即列举程序中所有可能的有的错误和容易发生的错误的特殊情况,根据他们选择测试用例。
4 因果图。从自然语言描述的程序规格说明中找到因(输入条件)和果(输出或程序状态的改变),通过因果图转换为判定表。
白盒测试
白盒测试也称结构测试,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的要求。
白盒测试常用的测试技术是逻辑覆盖、循环覆盖和基本路径测试。
1 逻辑覆盖。逻辑覆盖考察测试数据运行被测试程序时的覆盖程度,主要的逻辑覆盖标准有语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖6种。
- 语句覆盖。语句覆盖指选择足够的测试数据,使被测试过程中的每条语句至少执行一次。
- 判定覆盖。判定覆盖指设计足够的测试用例,使得被测试程序中的每个判定表达式至少获得一次“真”值和“假”值。
- 条件覆盖。条件覆盖指构造一组测试用例,是的每一判定语句中的每个逻辑条件的各种可能的值至少满足一次。
- 判定/条件覆盖。判定/条件覆盖指设计足够的测试用例,使得判定中的每个条件的所有可能值(真/假)至少出现一次,并使每个判定本身的判定结果(真/假)也至少出现一次。
- 条件组合覆盖。条件组合覆盖指设计足够多的测试用例,使得每个判定条件的各种可能值的组合都至少出现一次。
- 路径覆盖。路径覆盖指覆盖被测试程序中所有可能的路径。-
2 循环覆盖。执行足够的测试用例,使得循环中的每个条件都得到验证。
3 基本路径覆盖。在程序控制流图的基础上通过分析控制流图的环路复杂性,导出基本可执行路径集合,从而设计测试用例。
数据结构——排序
个人理解,仅供参考 ─=≡Σ(((つ??ω??)つ
排序就是将无序的记录变为有序的记录。
判断排序方法是否的稳定:当记录中存在相同的关键字时,关键字在排序前后相对位置关系不变
插入排序
直接插入排序:从第二个关键字开始,依次与其前面的所有关键字比较 希尔排序:排序表中含有n个记录,取当前表长的1/2为增量d,将其分为d个子表,子表关键字数为d+1。对子表进行直接插入排序。一趟排序结束后缩小增量,重复上述操作,直到增量为1。
交换排序
冒泡排序:两相邻的关键字相比较。n个记录,第0个记录与第1个记录比较,比较完后的第1个记录再与第2个记录比较,直到所有记录比较完,一趟比较结束,此后每趟比较的最后一位记录不再参与下次比较。开始下一趟比较,直到结束。 快速排序:一趟排序将记录分为两部分,在对两部分分别进行快速排序。 一趟快速排序,i,j为排序记录的起始下标和终止下标,第i+1个记录为temp,从下标j开始,由后向前,找到一个比temp小的记录,将记录放到下标i位置,i++。接着由下标i开始,由前向后,找到一个比temp大的记录,将记录放到下标j位置,j–。重复搜索步骤,直到i==j。第i+1个记录为temp。
选择排序
** 直接选择排序:每趟都是找出最小的记录与开始记录交换位置,每趟结束的开始位置的记录不再参与下一趟。
排序算法性能比较(稳定性与时间空间复杂度)
排序算法 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
希尔排序 | / | / | / | O(1) | 不稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
冒泡排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | 不稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
直接选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
:——: | :——-: | :——-: | :——-: | :——-: | :——-: |
Android 数据存储——SharedPreferences 存储
SharedPreferences 是使用键值对的方式存储数据,是Android平台上用于存储如配置信息等轻量级存储数据的接口。为每一条数据提供一个对应的键,在读取数据时通过键把相应的值取出来。支持多种数据类型存储,存储方便简单
代码
Activity
1 | import android.content.SharedPreferences; |
layout
1 |
|
微信小程序——配置文件介绍
微信小程序中的文件类型有
1 .json 后缀的 JSON 配置文件
2 .wxml 后缀的 WXML 模板文件
3 .wxss 后缀的 WXSS 样式文件
4 .js 后缀的 JS 脚本逻辑文件
JSON配置文件
** app.json 是对当前小程序的全局配置,包括所有页面路径、界面表现、网络超时时间、底部tab等
注: .json不支持注释
1 |
|
** page.json页面配置。页面配置只需要配置Window配置项的内容,页面中的配置项会覆盖app.json中window中相同的配置项。1
2
3
4
5
6
7
8{
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "微信接口功能演示",
"backgroundColor": "#eeeeee",
"backgroundTextStyle": "light",
"disableScroll":true//设置为 true 则页面整体不能上下滚动;只在 page.json 中有效,无法在 app.json 中设置该项
}
WXML配置文件
.wxml描述当前页面的结构
WXSS配置文件
.wxss描述 WXML 的组件样式
与 CSS 相比,WXSS 扩展的特性有:
- 尺寸单位
- 样式导入
尺寸单位
样式导入
选择器
选择器 | 样例 | 样例描述 |
.class | .intro | 选择所有拥有 class=”intro” 的组件 |
#id | #firstname | 选择拥有 id=”firstname” 的组件 |
element | view | 选择所有 view 组件 |
element, element | view, checkbox | 选择所有文档的 view 组件和所有的 checkbox 组件 |
::after | view::after | 在 view 组件后边插入内容 |
::before | view::before | 在 view 组件前边插入内容 |
JS脚本逻辑文件
.js交互逻辑,响应用户的操作
Android开发——获取网络权限
在Android开发中获取网络权限
在 manifests
文件夹中的 AndroidManifest.xml
中添加语句
1 | <uses-permission android:name="android.permission.INTERNET"></uses-permission> |
Android——监听Button(按钮)单击事件
在Android开发中实现button(按钮)点击事件的方法有几种,这里介绍其中三种:
方法一:当前类实现OnClickListener接口并在其必须实现的onClick方法中添加事件
1 | import android.os.Bundle; |
方法二:匿名内部类
1 | import android.os.Bundle; |
方法三:自定义方法绑定按钮
在.xml文件(布局文件)中给Button加上属性android:onClick="MyClick"
1 | import android.os.Bundle; |
推荐使用方法三
多个按钮使用同一个监听方法时,可使用按钮的 id
来区分。判断可用 if()...else if()...
或者 switch()
。
Java 网络编程——URL
URL类是java.net包中的一个重要的类。一个URL对象封装着一个具体的资源引用。URL对象通常包含最基本的三部分信息:协议、地址和资源。
URL的构造方法
方法一:public URL(String str) throws MalformedURLException. 该构造方法使用字符串初始化一个URL对象。
1 | try{ |
方法二:public URL(String protocol, String host, String file) throws MalformedURLException。该构造方法使用的协议、地址和资源分别由protocol、host和file指定。
1 | try{ |
读取URL中的资源
URL 对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。
程序代码
1 | import java.io.IOException; |
Java 从控制台读取以空格为分隔符的整数,计算其平方并开方
有段时间没看书了,连基本的控制台读取都不太记得了(〒︿〒) 为了方便以后查阅还是记下来好了(・ω・)/(ノД`゚)゚
思路:从控制台读取以空格为分隔符的数据,首先将所有输入看作一个字符串,利用String类提供的分解方法public String[] split(String regex),方法参数为分隔符(正则表达式),分解的结果存放到数组中。
1 | String strign[] = str.split(regex); |
整数的平方实现可用 Math.pow(n,2)方法或 n*n。
1 | Math.pow(n,m); //表示n的m次方 |
整数平方根可用 Math.sqrt()方法。
1 | Math.sqrt(n); //表示n的平方根 |
例子:
1 | import java.util.Scanner; |
测试结果
1 | 请输入:5 7 9 8 |
归并排序——Java语言描述
归并排序 所谓“归并”,是将两个或两个以上的有序文件合并成一个新的有序文件。其中将两个有序表合并成一个有序表的归并排序称为2-路归并。
程序代码
1 | import java.util.Arrays; |
测试结果
1 | 归并后序列:[8, 16, 25, 39, 52, 52, 56, 67, 70, 95] |