学习软件测试

Posted 一只小阿大:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习软件测试相关的知识,希望对你有一定的参考价值。


好久没写文章了,我是大四出来实习了,是嵌入式单片机一块的实习工作,因为回校考试以及住院,上了一个月班放了一个月假,刚回来领导让我转测试,所以这篇文章记录我学习软件测试的过程。

前两天师傅跟我说让我研究下c的单元测试,后面找到了两个工具,cunit和Visual Unit,但Visual Unit是收费的好像,但有演示版可以提供学习,还有测试覆盖率的一个工具gcov以及使用,后续我把测试出来的数据合并到了一个文件,用了python(合并两个txt文件数据),以及批处理bat(一键生成所需要的文件)。

c单元测试

瞎摸的,大佬勿喷

cunit

单元测试:对某一模块、函数来进行正确性检验的测试工作

c单元测试有一个cunit工具,与junit相似
官方文档:http://cunit.sourceforge.net/doc/index.html

Cunit也是有组织的,主要分几个角色,Registry,Suite及Test方法。可以通过下面例子,体会到这种组织关系。
按官方文档说明,使用Cunit的主要步骤有:(*必须)
1) Write functions for tests (and suite init/cleanup if necessary).
2) Initialize the test registry - CU_initialize_registry()
3) Add suites to the test registry - CU_add_suite()
4) Add tests to the suites - CU_add_test()
5) Run tests using an appropriate interface, e.g. CU_console_run_tests
6) Cleanup the test registry - CU_cleanup_registry

参考文章:https://www.cnblogs.com/linux-sir/archive/2012/08/25/2654557.html
                http://www.uml.org.cn/Test/201404151.asp

cunit在windows下安装:https://blog.csdn.net/godmaycry/article/details/77480549 (已验证可用)
        安装以及官方历程:https://www.jianshu.com/p/250e31aa7280

https://cloud.tencent.com/developer/article/1648952 文章中提到以下问题 (但我没遇到错误,以及提到了使用VS Code IDE)
安装完毕把C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\msys\\mingw\\lib\\libcunit.a拷贝到
C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\lib。
(不拷贝在下面gcc或者clang运行中,加入-lcunit参数会提示..lib: can’t find -lcunit的错误)

接下来把C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\msys\\mingw\\include\\CUnit\\目录中的所有.h文件
拷贝到C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\include中去。

注意:编译的时候需要连接cunit 
示例:gcc -o test test.c -lcunit

白盒测试主要用于对程序模块的测试,包括:
1.程序模块中的所有独立路径至少执行一次
2.对所有逻辑判定的取值("真""假")都至少测试一次
3.在上下边界及可操作范围内运行所有循环
4.测试内部数据结构的有效性等

白盒测试的主要方法:(常用1345)
1.逻辑覆盖测试(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖)
2.逻辑表达式错误敏感的测试
3.基本路径测试
4.数据流测试
5.循环测试(分为简单循环,嵌套循环,串接循环,非结构循环)

黑盒测试可用于各种测试:
1.不正确或遗漏的功能
2.接口错误,如输入输出参数的个数、类型错误
3.数据结构错误或外部信息(如外部数据库)访问错误
4.性能错误
5.初始化和终止错误

黑盒测试的主要方法:
1.等价类划分
2.边界值分析
3.比较测试
4.错误猜测
5.因果图

测试策略
V模型(关键)
编码 ------  单元测试    |  低
设计 ------  集成测试    |
需求分析 -- 确认测试    |
系统工程 -- 系统测试   V

gcov

gcc -fprofile-arcs -ftest-coverage -o test test.c    编译生成可执行文件(test).gcno文件
执行可执行文件./test 生成文件gcda
gcov test.c 生成gcov文件,该文件有代码覆盖率和每行代码执行次数

python代码

main.py

print("Hello World %d " % 2)
flist = ['data1.txt','data2.txt']
ofile = open('list.txt','w')
for fr in flist:
    for txt in open(fr, 'r'):
        print(txt)
        ofile.write(txt)
ofile.close()

bat代码

gcc -fprofile-arcs -ftest-coverage -o test _4_book.c -lcunit
test.exe => data1.txt
gcov _4_book.c => data2.txt
ren _4_book.c.gcov data3.txt
main.py
del data1.txt
del data2.txt

cunit测试代码(拿官方历程改了下)

/*
 *  Simple example of a CUnit unit test.
 *
 *  This program (crudely) demonstrates a very simple "black box"
 *  test of the standard library functions fprintf() and fread().
 *  It uses suite initialization and cleanup functions to open
 *  and close a common temporary file used by the test functions.
 *  The test functions then write to and read from the temporary
 *  file in the course of testing the library functions.
 *
 *  The 2 test functions are added to a single CUnit suite, and
 *  then run using the CUnit Basic interface.  The output of the
 *  program (on CUnit version 2.0-2) is:
 *
 *           CUnit : A Unit testing framework for C.
 *           http://cunit.sourceforge.net/
 *
 *       Suite: Suite_1
 *         Test: test of fprintf() ... passed
 *         Test: test of fread() ... passed
 *
 *       --Run Summary: Type      Total     Ran  Passed  Failed
 *                      suites        1       1     n/a       0
 *                      tests         2       2       2       0
 *                      asserts       5       5       5       0
 */

/* 根据书上程序流图编写 */

#include <stdio.h>
#include <string.h>
#include "CUnit/Basic.h"

/* Pointer to the file used by the tests. */
static FILE *temp_file = NULL;

/* The suite initialization function.
 * Opens the temporary file used by the tests.
 * Returns zero on success, non-zero otherwise.
 */
/* 第一步 套件初始化 编写init套件*/
int init_suite1(void)

   if (NULL == (temp_file = fopen("temp.txt", "w+")))
   
      return -1;
   
   else
   
      return 0;
   


/* The suite cleanup function.
 * Closes the temporary file used by the tests.
 * Returns zero on success, non-zero otherwise.
 */
/* 第一步 套件初始化 编写clean套件*/
int clean_suite1(void)

   if (0 != fclose(temp_file))
   
      return -1;
   
   else
   
      temp_file = NULL;
      return 0;
   


/* Simple test of fprintf().
 * Writes test data to the temporary file and checks
 * whether the expected number of bytes were written.
 */
void testFPRINTF(void)

   int i1 = 10;

   if (NULL != temp_file)
   
      CU_ASSERT(0 == fprintf(temp_file, ""));
      CU_ASSERT(2 == fprintf(temp_file, "Q\\n"));
      CU_ASSERT(7 == fprintf(temp_file, "i1 = %d", i1));
   


/* Simple test of fread().
 * Reads the data previously written by testFPRINTF()
 * and checks whether the expected characters are present.
 * Must be run after testFPRINTF().
 */
void testFREAD(void)

   unsigned char buffer[20];

   if (NULL != temp_file)
   
      rewind(temp_file);
      CU_ASSERT(9 == fread(buffer, sizeof(unsigned char), 20, temp_file));
      CU_ASSERT(0 == strncmp(buffer, "Q\\ni1 = 10", 9));
   


float bookExample(float x,float y,float z)

   if ((y>1) && (z==0))
   
      x = x/y;
   

   if ((y==2) || (x>1))
   
      x = x+1;
   
   
   return x;


void testBookExample(void)

   //满足判定覆盖标准的测试用例
   CU_ASSERT(2 == bookExample(1,2,1))
   CU_ASSERT(1 == bookExample(3,3,0))

   //满足条件覆盖标准的测试用例
   CU_ASSERT(1.5 == bookExample(1,2,0))
   CU_ASSERT(3 == bookExample(2,1,1))

   //满足判定/条件覆盖标准的测试用例
   CU_ASSERT(3 == bookExample(4,2,0))
   CU_ASSERT(1 == bookExample(1,1,1))

   //满足条件组合覆盖标准的测试用例
   CU_ASSERT(3 == bookExample(4,2,0))
   CU_ASSERT(2 == bookExample(1,2,1))
   CU_ASSERT(3 == bookExample(2,1,0))
   CU_ASSERT(1 == bookExample(1,1,1))

   //满足路径覆盖标准的测试用例
   CU_ASSERT(3 == bookExample(4,2,0))
   CU_ASSERT(1 == bookExample(3,3,0))
   CU_ASSERT(3 == bookExample(2,1,0))
   CU_ASSERT(1 == bookExample(1,1,1))


/* The main() function for setting up and running the tests.
 * Returns a CUE_SUCCESS on successful running, another
 * CUnit error code on failure.
 */
int main()

   CU_pSuite pSuite = NULL; //初始化结构体

   /* initialize the CUnit test registry */
   /* 第二步 初始化注册表 */
   if (CUE_SUCCESS != CU_initialize_registry())
      return CU_get_error();

   /* add a suite to the registry */
   /* 第三步 添加套件到测试注册表 */
   pSuite = CU_add_suite("Suite_1", init_suite1, clean_suite1);
   if (NULL == pSuite)
                            // 如果添加套件失败
      CU_cleanup_registry(); // 清理注册表并报错
      return CU_get_error();
   

   /* add the tests to the suite */
   /* 第四步 添加测试套件 */
   /* NOTE - ORDER IS IMPORTANT - MUST TEST fread() AFTER fprintf() */
   if ((NULL == CU_add_test(pSuite, "test of fprintf()", testFPRINTF)) ||
       (NULL == CU_add_test(pSuite, "test of fread()", testFREAD)) ||
       (NULL == CU_add_test(pSuite, "test of BookExample()", testBookExample)))
    // 如果添加测试套件失败清理注册表并报错
      CU_cleanup_registry();
      return CU_get_error();
   

   /* Run all tests using the CUnit Basic interface */
   /* 第五步 使用适当的接口运行测试 */
   /* 
   CU_BRM_NORMAL    Normal模式-失败和运行摘要打印[default]
   CU_BRM_SILENT    静默模式-除了框架错误消息外,不输出任何输出。
   CU_BRM_VERBOSE   详细模式——运行详细信息的最大输出。
   */
   CU_basic_set_mode(CU_BRM_VERBOSE); // 设置基本接口的运行模式
   CU_basic_run_tests(); // 使用基本接口运行所有注册的CUnit测试

   /* 第六步 清理测试注册表 */
   CU_cleanup_registry();
   return CU_get_error();

正式开始学习测试

就上面那些我花了两天时间,因为我实在不懂测试,那时候听测试用例这个名词我都不知道咋写。。。
但我还是会专注于嵌入式软件开发的,后续我会把之前工作写的一个小型任务状态调度机发出来。

今天去b站看到了黑马有软件测试的一套学习路线,我根据黑马给的路线开始学习
黑马程序员2022年软件测试学习路线图

现在在看黑马程序员软件测试从入门到精通_软件测试基础教程

我会把跟视频学的代码,以及笔记写到文章里

软件测试的原则

1、所有的测试都应追溯到用户需求(视频网站,点击后最大化)
2、应当把“尽早和不断地测试”作为座右铭
3、测试工作应该由独立的专业的软件测试机构来完成
4、Pareto原则,测试发现的错误中80%很可能起源于20%的模块中
5、设计测试用例时,应该考虑各种情况。
6、对测试出的错误结果一定要有一个确认的过程(描述缺陷报告)
7、制定严格的测试计划
8、完全测试是不可能的,测试需要终止
9、注意回归测试的关联性
10、妥善保存一切测试过程文档

软件产品质量模型(ISO/IEC 9126)

有6大特性27大子特性,可以参考谈一谈软件质量模型这篇文章
软件产品质量模型对产品设计时需要考虑的地方进行了高度概括
六大特性:
1、功能性:是指软件产品在指定条件下使用时,提供满足明确和隐含要求的功能的能力。
2、可靠性:是指在特定条件下使用时,软件产品维持规定的性能级别能力。第一层:设别最好不要出故障;第二层:设备出故障了不要影响主要的功能和业务;第三层:如果影响了主要功能和业务,系统可以尽快定位并恢复。
3、易用性:是指用户在指定条件下使用软件产品时,产品被用户理解、学习、使用和吸引用户的能力。简单10个字:易懂、易学、易用、漂亮好看(用户体验好)。
4、效率:是指在规定条件下,相对于所用资源的数量,软件产品可提供适当的性能的能力。通常,效率就是我们常说的产品性能(单选、多选例子)
5、维护性:是指产品可被修改的能力,这里的修改是指纠正、改进软件产品和软件产品对环境、功能规格变化的适应性(QQ隐身在线显示)
6、可移植性:是指软件产品从一种环境迁移到另一种环境的能力。这里的环境,可以理解为硬件、软件或组织等不同的环境。(win10、ios …)

软件质量模型保证(SQA)

软件质量保证(SQA-Software Quality Assurance)是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。软件质量保证的目的是使软件过程对于管理人员来说是可见的。它通过对软件产品和活动进行评审和审计来验证软件是合乎标准的。软件质量保证组在项目开始时就一起参与建立计划、标准和过程。这些将使软件项目满足机构方针的要求。

软件测试基本流程

1、需求分析
2、编写测试用例
3、评审测试用例
4、搭建测试环境
5、等待开发提交测试包
6、部署测试包
7、冒烟测试(对软件主体基本功能进行基本测试)
8、执行测试用例
9、BUG跟踪处理(提交及回归BUG)
10、N轮之后符合需求
11、测试结束

HTML

我不太清楚为啥测试需要学习HTML,我虽然以前学过,以及忘记差不多了,跟着课程学回炉重造吧。

我没用黑马视频中的那个软件写的,我用的vscod,代码中img标签中图片自己找哈,我就不附上来了,注意路径哈。

_01_html.html

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title>网页</title>
</head>

<body>
	<p id="top">这是顶部锚点</p>
	<h1>测试h1</h1>
	<h2>测试h2</h2>
	<p>测试p</p>
	<b>加粗</b>
	<strong>也是加粗</strong>
	<u>下划线</u>
	<i>斜体</i>
	<em>也是斜体</em>
	<s>删除</s>
	<del>也是删除</del>
	<br />
	<p>换行标签br</p>

	添加图片
	<img src="OIP-C.jfif" />
	添加宽高
	<img src="OIP-C.jfif" height="200" width="200" />
	鼠标悬停图片看到文字
	<img src="OIP-C.jfif" title="你好" />
	提醒文字
	<img src="3-C.jfif" alt="提醒文字,只有图片路径写错之类的情况才会显示" />
	超链接
	<a href="https://www.baidu.com/">点击跳转进入百度</a>
	<a href="https://www.baidu.com/" target="_blank">点击进入百度,重新打开一页</a>
	<a href="###">空连接</a>
	<a href="javascript:;">JavaScript空连接</a>
	<a href="javascript:(void);">JavaScript void空连接</a>
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<br />
	<a href="#top">跳转到顶部</a>

	<!--
			form表单 
			action 代表提交给哪一个后台程序
			method 代表传输过程中用哪种传输方式 post加密 get不加密
		-->
	<form>
		<!--
				type 类型
				name 代表输入框的名字
				id   输入框的id编号
				value 默认存在输入框的文字
				placeholder 提示文字,输入就删除了  注意:低版本ie如6789就看不见
				autofocus 输入框默认选中状态
			-->
		昵称:<input type="text" name="nicheng" id="1" value="请输入昵称" /><br />
		昵称:<input type="text" name="nicheng" id="2" placeholder="请输入昵称" autofocus="autofocus" /><br />
		密码:<input type="password" name="mima" id="3" /><br />
		<!--
				单选按钮:
				name 为了说明两个单选按钮是一起的,选了一个就不能选另一个
				label 让点文字也一样选按钮
				checked 默认选择
			-->
		性别:<input type="radio" name="xb" id="nan" checked="checked" /> <label for="nan"></label>
		<input type="radio" name="xb" id="nv" /> <label for="nv"></label><br />

		<!-- 
				下拉菜单:
				select 下拉菜单标签
				option 选项
				optgroup 选项分组提示
			 -->
		地址:
		<select name="dizhi">
			<option value="">北京</以上是关于学习软件测试的主要内容,如果未能解决你的问题,请参考以下文章

软件测试和linux运维哪个工作比较好学习周期短

软件测试全套教程,2020年全新软件测试学习路线图

学习软件测试好呢,还是学习开发好呢?

如何学习自动化测试

本人大四了,想学习软件测试,哪里有比较好的学习视频资料?

“学习苦,学习累,学习还要交学费,不如..........”[自动化测试——准备测试数据]