软件测试概述:
- 在学习单元测试和Ui测试之前先要了解基本的软件测试基础
- 软件测试基本概念:
- 识别软件却显得过程:具体实践中通过设计测试用例,发现实际结果与预期结果不一致的地方(狭义上)
- 之软件生命周期中所有的检查、评审和确认工作,包括对分析、设计阶段,以及开发后维护阶段的各类文档、代码的审查和确认。
- 软件测试两大任务:
- 验证:保证软件正确地实现某一特定功能的一系列活动
- 确认:保证软件的实现满足了用户需求的一系列活动
- 软件测试的目的:
- 发现软件中的缺陷:
- 测试只能证明软件中存在缺陷,不能证明软件不存在缺陷
- 测试可以将软件中的缺陷率降到一定程度,而不能彻底消灭软件中的所有缺陷
- 以较少的测试用例、时间和人力找出软件中的各种错误和缺陷,以确保软件质量
- 发现软件中的缺陷:
-
软件测试最终目标:
- 确保软件完成了它所承诺或公布的功能
- 确保软件的功能符合用户的需求,把尽可能多的问题在发布或交付前发现并改正
- 确保软件满足性能要求
- 确保软件的健壮性和对用户环境的适应性
- 为软件质量评估提供依据
- 为软件质量改进和管理提供帮助
-
软件测试过程中的基本原则:
- 保证测试的覆盖程度,但请注意:穷举测试对实际软件是不可能实现
- 所有的测试都应追溯到用户需求
- 越早测试越好,测试过程应与开发过程紧密结合
- 测试的规模由小及大,从单元测试到系统测试
- 为了尽可能地发现错误,应该由独立的第三方进行测试
- 测试人员不能为了便于测试而擅自修改程序
- 既应该测试软件该做什么,也应该测试软件不该做什么
- Bug的80-20经验比例
- 在分析、设计、实现阶段的复审和测试工作能狗发现和避免80%的bug
- 系统测试又能找出其余Bug中的80%
- 最后5%的Bug可能只有在用户范围、长时间使用后才会暴露出来
- 软件测试重点环节:
- 测试环境的搭建
- 测试用例的良好设计
- 测试工作的管理
- 软件测试结果的度量指标
- 测试覆盖率:
- 有多少需求和代码已经被测试
- 缺陷发现率:
- 缺陷何时被发现,并且有多少缺陷已经被发现
- 测试成功率:
- 有多少测试已经通过
- 计算以通过的测试用例的数目、可用测试用例的数目
- 测试覆盖率:
- 测试方法:
-
黑盒测试:黑盒测试注重测试软件功能,一般在测试后期,与白盒测试是互补的关系。
- 错误类型:
- 功能不正确或者遗漏
- 界面错误
- 数据结构错误或外部数据库访问错误
- 性能错误
- 初始化和终止错误
- 错误类型:
-
白盒测试:把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
-
静态分析:
-
静态测试不实际运行软件,主要是对软件的编程格式、结构等方面进行评估。
-
静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,也可以借助软件工具自动进行。
-
因为静态测试方法并不真正运行被测程序,只进行特性分析。所以,静态方法常常称为“分析”,静态测试是对被测程序进行特性分析方法的总称。
-
-
静态分析可以辅助完成以下任务:
-
检查算法的逻辑正确性。
-
检查模块接口的正确性。
-
检查输入参数是否有合法性检查。
-
检查调用其他模块的接口是否正确。
-
检查是否设置了适当的出错处理。
-
检查表达式、语句是否正确,是否含有二义性。
-
检查常量或全局变量使用是否正确。
-
检查标识符的使用是否规沧、- . 致。
-
检查程序风格的一-致性、 规范性。
-
检查代码是否可以优化,算法效率是否最高。
-
检查代码注释是否完整,是否正确反映了代码的功能。
-
-
动态分析
- 动态方法的主要特征是:计算机必 须真正运行被测试的程序,通过输入测试用例,对其运行情况即输入与输出的对应关系进行分析,以达到检测的目的。
- 动态测试包括:
- 功能确认与接口测试
- 覆盖率分析
- 性能分析
- 内存分析
-
- 打开AS,新建项目选择No Activity模板,进入
- src目录下有两个分别叫androidTest和test的文件夹,分别做Ui测试和单元测试,先从单元测试开始:
- 单元测试:
- Junit是Java中的一个单元测试框架,使用注解即可完成单元测试
- 在dependencies中已经添加junit
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation
'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestImplementation
'com.android.support.test.uiautomator:uiautomator-v18:2.1.0'
}
- 在test下的ExampleUnitTest中:
- 发现使用了注解和断言
- @Test 说明该方法时 测试方法,必须是public void 可以抛出异常
- @Ignore 忽略该测试方法
* 忽略一个方法
@Ignore
@Test
public void ...
@Ignore("reason")
@Test
public void ...
* 忽略整个测试方法
@Ignore
public class ...
- @Before @After
- @Before 他会在每个测试方法执行前都调用一次
- @After 他会在每个测试方法执行完都调用一次
- @BeforeClass 只会为一个测试类执行一次,优先于@Before, 注解的方法必须是public void static修饰
- @AfterClass注解的方法会在所有测试方法执行完成一次之后被调用一次,注解的方法必须是public void static修饰
public class ExampleUnitTest {
@BeforeClass
public static void init(){
System.out.println("-----init-----");
}
@Before
public void setUp(){
System.out.println("-----setUp-----");
}
@After
public void tearDown(){
System.out.println("-----tearDown-----");
}
@AfterClass
public static void finish(){
System.out.println("-----finish-----");
}
@Test
public void test1() {
System.out.println("----test1-----");
}
@Test
public void test2(){
System.out.println("----test2----");
}
}
输出:
-----init-----
-----setUp-----
-----test1-----
-----tearDown-----
-----setUp-----
-----test2-----
-----tearDown-----
-----finish-----