- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 【loadrunner11】生成指定长度随机字符串
/在loadrunner使用的C98语法,需要将所有定义都定义在函数头部,否则提示报错illegal statement termination//在loadrunner中使用sizeof计算字符串长度会提示Syntax error on line 5 near "character set'int i = 0;int randid;for (i;i < slen;i++) {在引用参数处,使用:{randomStr}
2024-06-20 14:41:40
198
原创 【软件测试】测试策略的制定
测试策略制定:需求是软件设计与测试的来源,除了终端用户的功能需求外,还有设计需求、可靠性需求、可测试性需求、性能需求、安全性需求等。对于测试工作而言,所有的需求最后都需转化为测试需求,之后分析这些需求,并以此为根据制定测试策略,合理选择各种测试技术。从测试需求开始,测试需求的识别是后续的测试工作的基础,我们在拿到需求之后,要能识别测试需求,分析此测试需求,最后确定并提取出测试对象,确定对每一对象如何测试,拿出具体的方法及措施,这就是测试策略制定的问题。完整的需求文档包括以下内容:功能需求非功能性
2021-06-16 22:50:13
761
3
原创 【软件测试】软件测试的划分
按测试实施组织:1.α测试:α测试是由一个用户在开发环境下进行的测试,也可以是公司内部用户在模拟实际操作环境下进行的测试,目的是为了评价软件的FLURPS(功能、局域化、可使用性、可靠性、性能和支持),α测试不能由开发和测试人员完成。2.β测试:beta测试是一种验收测试,beta测试由软件的最终用户们在一个或多个场所进行。3.第三方测试:介于开发方和用户方之间的组织的测试。按是否运行划分:1.静态测试: 静态测试指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查.
2021-06-16 20:38:48
847
5
原创 【软件测试】按照开发阶段划分:单元测试、集成测试、系统测试
测试的分类可以从很多方面来划分,例如按照开发阶段划分、按照测试实施组织划分、按照是否运行划分,这篇博客主要内容是按照开发阶段划分的测试的种类。首先我们要了解测试金字塔:最上层是UI界面层,包含功能验证测试、兼容性测试。中间一层是业务逻辑层,包含客户端模拟测试、内外接口测试、SDK接口测试。底层是数据处理层,单元测试、CodeReview(代码评审)。测试金字塔越往上回报率越低。按开发阶段划分:1.单元测试:单元测试又称模块测试,是对软件组成模块进行测试,其目的是检验软件基本组成单位的正确
2021-06-07 22:32:56
4151
5
原创 【软件测试】测试用例的设计
测试用例:是为了实施测试而向被测试的系统提供的一组集合,这组集合包括:测试环境、操作步骤、测试数据、预期结果等要素。评价测试用例的标准:1.用例表达清楚,无二义性。2.用例可操作性强。3.用例的输入输出明确,一条用例只有一个预期结果。4.用例的可维护性好。5.用例对需求的覆盖性高。5.暴露程序bug的能力强。测试用例的总体设计方法:基于需求的设计(RBT):是一种最根本的软件测试,重点关注两个问题,一是验证需求是否正确、完整、无二义性,并且逻辑一致,二是要从“黑盒”的角度设计出充分并且必要
2021-06-05 00:18:21
567
6
原创 【软件测试】基础概念总结
什么是软件测试?在需求正确的前提下,验证软件的功能是否满足用户的需求,软件测试的目的是保证和提高软件的质量,给用户交付一个高质量高可用度的软件。软件测试是测试人员确保程序做了它应该做的事情,而调试是程序开发人员确保程序做了他想要程序实现的功能,两者有很大的区别。软件中的需求:满足用户的期望和规定的合同(标准、规范、流程)所需要的条件和权能,包含用户需求和软件需求。测试用例:是为了实施测试而向被测试的系统提供的一组集合,包括:测试环境、操作步骤、测试数据、预期结果等要素。瀑布模型:是其他模型的基础框架
2021-05-31 21:36:42
194
2
原创 【算法】排序4:归并排序、计数排序(非比较排序)
归并排序是建立在归并操作上的一种有效的排序算法,归并就是将已有序的子序列合并,得到完全有序的序列,归并排序的时间复杂度为O(N*logN)void _MergeSort(int*a, int begin, int end,int*tmp){ if (begin >= end) return; int mid = begin + end >> 1; //先划分成两段 _MergeSort(a, begin, mid, tmp); _MergeSort(a, mid + 1,
2021-05-30 22:53:26
227
7
原创 【算法】排序3:优化版快速排序、非递归实现快速排序
快速排序整体的综合性能和使用场景都是较好的,但在有序的情况下快速排序反倒会变得慢起来,这时使用三数取中法可以把有序这种最坏情况变成最优解,实现快速排序的优化。int GetMidIndex(int* a, int begin, int end){ int mid = (begin + end) >> 1; //采用移位的方式除二 if (a[begin] < a[mid]) { if (a[mid] < a[end]) { return mid; }
2021-05-27 21:53:51
264
4
原创 【算法】排序2:三种方法实现快速排序
快速排序是一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。实现将区间按照基准值划分为左右两半部分有三种方式:hoare版本 左右指针int PartSort(int* a, int begin, int end) { int key = a[end]; //end做key,左边先走 begin
2021-05-27 00:16:46
399
2
原创 【算法】排序1:直接插入排序、希尔排序、选择排序、堆排序
排序在许多地方都有应用,常见的排序算法可以分为插入排序、选择排序、交换排序、归并排序四类。插入排序插入排序又可以分为两种:①直接插入排序②希尔排序直接插入排序就是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列,直接插入排序的时间复杂度为O(N^2)void InsertSort(int*a, int n) { //控制end的位置从2走到n-2 for (int i = 0; i < n - 1;++i) {
2021-05-24 23:52:23
1217
8
原创 【C语言】带头双向循环链表增删改查的实现
带头双向循环链表:虽然结构比较复杂,一般用在单独存储数据,但实际中使用的链表数据结构大多数都是带头双向循环链表。带头双向循环链表虽然结构复杂,但是实际上实现起来比单链表和顺序表都要更加简单,这篇博客的内容就是带头双向循环链表增删改查的实现。//list.h#pragma once#include <stdio.h>#include <assert.h>#include <malloc.h>typedef int LTDataType;typedef str
2021-05-07 11:17:36
305
4
原创 【C语言】单链表增删改查的实现
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。这篇博客是实现无头单向不循环的链表的头插,尾插,头删,尾删,查找,在某个位置插入,删除某个位置后的值。//slist.h文件#pragma once#include <stdio.h>typedef int SLDataType;typedef struct SListNode { SLDataType data; struct SListNode* next;}SListNo
2021-05-05 20:17:35
483
5
原创 【C语言】顺序表的动态存储:增删改查的实现
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。使用定长数组存储的是静态顺序表,使用动态开辟的数组存储的是动态顺序表。以下是动态顺序表增删改查功能的实现://seqlist.h#pragma once#include <stdio.h>#include<assert.h>#include <stdlib.h>typedef int SLDatatype;typedef struct Seq
2021-04-29 21:14:33
849
7
原创 【C语言】常用字符串函数和内存函数的实现
strlen函数 常用于计算字符串中的字符个数//my_strlen的实现int my_strlen(const char*str){ assert(str != null); int len = 0; while (*str != '\0'){ ++len; ++str; } return len;}int main(){ //char*p1 = "hello world"; //两种字符串赋值方式 //printf("%d\n", strlen(p1)); c.
2021-04-20 14:46:18
489
8
原创 【C语言】数组指针、函数指针、函数指针数组
数组指针与指针数组的概念很容易混淆,数组指针本质上就是一个指针,它所指向的内容是一个数组,例如int (*p)[5]={0};就是一个数组指针,其中p的类型为int (*)[5],而指针数组本质上是一个数组,如int * arr[5]={0};是一个数组,数组里面每一个元素都是一个指针。例如:int a[10]={1,2,3,4};int(*p)[10]=&a; //数组指针函数指针,定义一个指针变量来存放函数地址,这个指针变量就叫作函数指针。例如:void test(){print
2021-04-15 18:45:30
466
8
原创 【Linux】守护进程/精灵进程的创建
守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。守护进程独立于控制终端,它们常常跟随系统启动时启动,在系统关闭时才结束。守护进程周期性的执行某些任务或者等待处理某些事件,Linux上的大多数服务器都是用守护进程实现的。在系统启动中默认的守护进程的父进程ID全都是init,守护进程特征就是在程序运行名后加了一个d,但不是所有的尾字母是d的进程都是守护进程。要创建一个守护进程,我们需要:1.调用umask()函数,将文件模式创建屏蔽字设置为0 umask(0); //用uma
2021-04-12 21:36:59
3207
12
原创 【Linux】Socket套接字编程基础
socket编程是网络通信程序的编写,涉及到应用层以下各层协议的选择。在传输层中我们主要了解TCP、UDP两种协议:TCP:传输控制协议,面向连接,面向字节流,是一种可靠的传输通信协议,安全性较高,常用于文件的传输。UDP:用户数据报协议,无连接,面向数据报,是一种不可靠的传输通信协议,实时速度高,常用于视频/音频的数据传输。想使用套接字socket接口来进行UDP网络通信程序的编写,首先要了解C/S(客户端/服务端)架构,客户端是主动发起请求的一方,服务端是被动接受请求的一方。服务端实现的流程:
2021-04-07 22:55:10
1406
5
原创 【C语言】递归:汉诺塔问题和青蛙跳台阶问题
递归就是一个函数执行过程中调用自己,在c语言中有很多关于递归的经典问题,例如:斐波那契数列问题、汉诺塔问题等,在研究递归问题时我们要注意三点:1.递归的结束条件2.递归在每次进行过程中,都得离条件越来越近3.相邻两次递归调用之间的关联关系汉诺塔问题:有三根杆子A, B, C。A杆上有N个(N > 1)穿孔圆盘, 盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:1.每次只能移动一个圆盘;2.大盘不能叠在小盘上面,可将圆盘临时置于B杆, 也可将从A杆移出的圆盘重新移回A杆, 但都
2021-04-06 19:45:11
1178
9
原创 【C++】自旋锁、读写锁、可重入锁与不可重入锁的简单理解
自旋锁(spinlock):当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成忙等busy-waiting,消耗CPU资源。在之前的博客中,我们了解过互斥锁,互斥锁实际上是一种sleep-waiting的锁,当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将被阻塞放入等待队列,不会造成忙等现象,CPU可以去处理其他任务,不会浪费C
2021-04-01 22:52:44
2499
7
原创 【算法】CAS的实现和无锁编程
CAS(Compare and swap,比较与交换) 是一种有名的无锁算法。比较与交换,先比较,发现与预期一致,说明没有其他线程改动过,于是再交换。如果与预期不一致说明改动过,就再来一次。与各类锁相比,CAS算法会使得程序设计变得复杂,但是其拥有优越的性能优势,而且不会出现死锁(没有锁,不会有线程一直阻塞),使用CAS算法没有锁之间竞争带来的开销,也没有线程间频繁调度带来的开销大,拥有更优越的性能。CAS属于乐观锁思想的实现方法,当多个线程试图使用CAS同时更新同一个数据时,只有一个线程能更新数据.
2021-03-31 22:29:58
2090
8
原创 【数据库】悲观锁与乐观锁的理解和实现
什么是乐观锁和悲观锁?这其实是人们定义出的一种思想,可以对应为在生活中乐观的人和悲观的人。乐观锁总是相信最好的情况,去相信别人不会修改自己的数据,在每次取数据的时候都不会上锁,因此比较适用于读多写少的情况。而悲观锁恰恰相反,总是担心别人会去修改自己的数据,所以在每一次取数据时都会上锁,比较适用于写多读少的情况。悲观锁首先我们来了解一下悲观锁,悲观锁认为被它保护的数据不安全的,随时都有可能变动,一个进程或线程拿到悲观锁后,其他的进程或线程都不能对该数据进行修改,只能等待锁被释放,下一个拿到锁的进程才能进
2021-03-30 19:57:39
2868
7
原创 【C++】线程安全的单例模式:饿汉方式、懒汉方式
单例模式是一种非常经典的设计模式,一个类在内存中只能实例化一个对象,资源在内存中只能有一份,提供一个统一的接口进行访问。要实现单例模式可以采用两种方式:饿汉方式、懒汉方式。饿汉方式:在程序的初始化阶段完成资源的申请加载初始化以及对象的实例化,可以将其看作是一个吃完饭立马洗碗的饿汉,因为这样下一次吃饭时就可以直接端起碗吃饭,这种方式的思想是以空间换时间。例如市面上的大型手游王者荣耀就采用的是这种思想,在游戏开始之前初始化完所有资源,在游戏进行中就避免了再去加载资源,保持游戏的流畅度。用饿汉方式来实现单
2021-03-28 20:31:28
2453
11
原创 【Linux】线程安全:互斥锁、条件变量、信号量、死锁
线程安全是指多个线程对于临界资源的访问是安全的,而要实现线程安全,我们要采用同步与互斥的方式。互斥锁互斥锁本质上是一个只有0和1的计数器,本身也是一个临界资源(采用一步置换的方法保持自身操作的原子性)。互斥锁用于标记临界资源的访问状态,每个线程在访问临界资源之前,都要先访问互斥锁,判断当前是否是可访问状态,如果是可访问状态,则先将访问状态置为不可访问,再去访问临界资源,访问完成后再将访问状态置为可以访问,若是不可访问状态,则阻塞或者是报错。要使用互斥锁,我们可以调用以下接口。//创建互斥锁pt
2021-03-26 21:32:30
1440
9
原创 【Visual Studio】在vs中添加自定义动漫背景
首先在vs工具里找到拓展和更新,搜索ClaudialDE并下载安装,桌面就会出现如图的默认动漫背景。然后在vs工具的选项里,设定各项参数。在上图的路径里添加你想加入的动漫背景图,在图片路径里选择你要加入的图片。一个可爱的动漫背景就设置好啦。...
2021-03-24 13:31:35
2261
7
原创 【Linux】线程的创建、终止、等待、分离
操作系统并没有提供线程操作的系统调用接口,我们需要明确的是操作线程的接口都是库函数。因此在操作线程时需要添加头文件 #include<pthread.h>线程的创建:int pthread_create(pthread_t * tid,pthread_attr_t * attr,void * (* start_routine)(viod *),void * arg);tid是用于获取创建的线程idattr是线程属性,通常置NULLstart_routine是线程入口函数arg是通
2021-03-22 22:12:16
1235
8
原创 【Linux】多进程与多线程的理解及优缺点
首先我们的问题是,线程是什么?线程是进程中的一条执行流,是CPU执行调度的基本单位,一个进程中可以有多个线程。在Linux下,线程执行流是通过PCB实现的,且一个进程中可能有多个PCB,这些PCB共享同一个进程中大部分资源,也可以将其称作轻量级进程。(Linux下进程是系统进行资源分配的基本单位)线程之间共享虚拟地址空间(代码段和数据段)、文件描述符表、信号处理方式、工作路径等,线程之间独有的有线程栈、寄存器(上下文数据)、信号屏蔽字(信号阻塞集合)、优先级、errno、线程标识符等。多线程与多进程
2021-03-21 21:41:56
3223
7
原创 【Visual Assist X】VAssistX的安装和使用
VAssistX全名Visual Assist X,是一款Microsoft Visual Studio插件,是Visual Studio中非常实用的工具。VAssistX拥有许多功能,例如关键字和已有类名、方法名的提示;关键字、类名、方法名等用不同的颜色标出高亮;声明与实现的快速跳转、.cpp与.h文件的快速切换;文件名和标识符的查找;代码重构、重命名标识符等功能。Visual Assist X的官方下载地址为:http://www.wholetomato.com/downloads/default.
2021-03-19 23:18:35
4481
8
原创 【Linux】硬链接与软链接
在区分硬链接与软链接之前,我们先要了解inode的相关概念。在文件系统中包含inode区和data区,其中inode区又包括inode表、inode位图、block位图。inode全称为index node,也就是索引节点,用于存放文件的元数据信息。在Linux操作系统中,每一个文件都对应一个inode编号,系统用inode编号来识别访问文件。一些关于inode的基础指令如下:stat filename 查看文件的详细信息(包括inode信息);ls -li 长格式显示inode节点信息;df -
2021-03-18 23:21:39
1524
10
原创 【Linux】信号的产生、注册、注销、处理、阻塞
首先,我们要明确一个概念,信号和信号量不是同一个东西!在上一篇博客中有提到,信号量本质上就是一个计数器,用于实现进程间的同步与互斥,而信号则是一个软件中断,是去通知进程发生了某个事件,打断进程当前的操作去处理这个事件。在Linux中,我们可以使用 kill -l去查看所有信号,其中1 ~ 31号信号是非可靠信号,有可能会产生信号丢失情况,34 ~ 64号信号是可靠信号,不会产生信号丢失情况。信号的产生:信号的产生分为软件和硬件两个方面:硬件:ctrl + c 产生中断SIGINT信号ctr
2021-03-17 23:44:57
2067
9
原创 【Linux】IPC进程间通信:管道、共享内存、消息队列、信号量
进程间通信,英文简称IPC,本质上是两个进程之间的数据交换。因为进程具有独立性,每个进程都有自己的虚拟地址空间,访问的都是自己的虚拟地址,因此进程间无法直接通信,需要操作系统提供中间媒介进行通信。进程间通信分为四种方式:管道、共享内存、消息队列、信号量。其中消息队列和信号量在平时应用较少,在本文中简略介绍。管道管道的本质是内核中的一块缓冲区,管道属于半双工通信,是可以选择方向的单向通信。管道自带同步与互斥:同步:管道的写操作在不超过PIPE_BUF大小(4096字节),保证原子性。互斥:让资
2021-03-09 23:27:26
1279
8
原创 【Linux】静态库和动态库的生成与使用
库文件,是一堆二进制代码实现的集合文件。我们要生成一个库,就是将一大堆代码实现打包生成一个库文件,其中不能包括main函数。生成可执行程序链接动态库时,是将动态库中的函数信息表记录到可执行程序中,生成的可执行程序较小,运行时要加载动态库,不会造成代码冗余,在gcc编译器中就默认使用动态链接。生成可执行程序链接静态库时,是将静态库中使用到的代码全部写入可执行程序中,生成的可执行程序较大,运行时不需要库文件,但却会造成代码冗余。生成动态库命名方式:以lib作为前缀,以.so作为后缀,中间为名称gc
2021-03-07 23:42:23
2645
11
原创 【Linux】minishell的实现
shell是什么?shell可以理解为操作系统内核与用户之间的桥梁,是一个命令行解释器程序,shell程序有很多种,例如:bash、dash、csh等。如果我们想要实现一个简单的shell程序,我们可以分为以下几步:捕捉键盘输入 sacnf/gets获取键盘输入的数据 eg:[ ls -l -a]字符串格式解析(以空白字符为间隔,分割成一个一个的字符串,去掉空白字符,变成 [ls] [-l] [-a])为shell程序创建一个子进程在子进程中进行程序替换,替换为ls程序进程等待,等待子进程
2021-03-06 20:35:10
2543
9
原创 【Linux】进程终止与进程等待/僵尸进程与孤儿进程
进程终止:简单来说就是如何退出一个进程在main函数中可以直接采用return退出(在普通函数中return只能退出函数而不能退出进程)在函数任意位置调用 ==viod exit(int status); ==其中,exit是库函数,在退出进程时会刷新缓冲区,将缓冲区中的数据写入文件,status为进程退出的返回值。在函数任意位置调用 _exit(int status);值得注意的是,_exit是系统调用接口,使用_exit退出进程时会直接释放资源,不会刷新缓冲区。进程等待:父进程等待子进程
2021-03-05 21:40:22
2120
9
原创 【数据库】MySQL新手安装教程
下载MySQL下载路径:https://downloads.mysql.com/archives/community/解压MySQL:如解压到D:\Tools\mysql-5.7.27-winx64(注意不要放在中文路径、有空格或特殊字符的路径中)配置环境:右键 此电脑 -> 属性 ->高级系统设置->环境变量->系统变量名->新建变量名为:MYSQL_HOME变量值为:MySQL解压的根目录(如:D:\Tools\mysql-5.7.27-winx64)在系统
2021-01-23 21:44:10
2947
5
原创 【软件工程】十大模型
1.瀑布模型瀑布模型将软件的生命周期划分为:制定计划、需求分析、软件设计、程序编写、软件测试、运行维护六个基本活动,并规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。瀑布模型将软件生命周期分为三个大阶段:定义阶段,开发阶段,运行和维护阶段。瀑布模型的阶段间具有顺序性和依赖性:前一阶段完成后,才能开始后一阶段;前一阶段的输出文本为后一阶段的输入文本。在瀑布模型的每个阶段都坚持:(1)每个阶段都必须完成每个阶段规定的文档。(2)每个阶段结束前都要对所完成的文档进行评审,以便于尽早发现
2020-12-11 23:27:59
14207
2
原创 【C语言】扫雷小游戏详解
在编写扫雷小游戏之前,第一,我们应该列出我们想要实现的扫雷小游戏的功能:1.显示选中的坐标周围的雷的个数。2.保证第一次选中的坐标不是雷。3.选中的坐标周围8个格子中没有雷,则展开。第二,我们应该明白我们需要两个棋盘来实现扫雷游戏:一个棋盘用来展示给玩家,初始界面全为“ * ” (未翻开的格子),这个页面就是我们常见的扫雷页面。另一个棋盘用来给编写者看,棋盘内只有字符‘1’和字符‘0’ 。‘1’代表雷,‘0’代表非雷。使用字符‘1’‘0’来代表雷和非雷有利于我们下一步计算坐标周围雷的个数。1.初始
2020-10-22 21:03:22
11255
19
原创 【C语言】三子棋小游戏详解
在用c语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利。以下为源代码:1.首先打印出菜单。void menu(){ printf("**********************************\n"); printf("**********************************\n"); printf("***** 0.play *************\n"); pr
2020-10-20 23:37:21
6444
25
原创 【Linux】基本指令(一)
Linux是一种常见的操作系统,Linux下的所有操作都是在命令行终端下进行的。命令格式为:命令名称 [操作选项] [操作对象]命令名称与操作选项与操作对象之间以空格连接,[ ]可有可无。Linux下的目录大体上可以分为五类:目录相关命令文件相关命令压缩解压缩命令匹配查找命令其他命令1.目录相关命令ls指令:浏览目录(文件夹)中的内容,默认浏览当前所在目录。语法: ls [选项] [目录或文件]...
2020-10-19 23:57:16
942
1
原创 【C++】日期类的实现
#include<stdlib.h>#include<string.h>using namespace std;class Date {public: Date(int year = 1900, int month = 1, int day = 1) { if (year <= 0 || month <= 0 || day <= 0 || day > getDay(year, month)) //判断日期是否有效 { cout &l
2020-10-18 23:57:59
952
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人