2022年国内软件质量调查,一起关注质量、提升质量,是一种责任,任重道且长。

2022-12-21 18:04:14 浏览数 (1)

今年,软件质量报道公众号、CSDN社区、QECon组委会 联合 异步社区、腾讯WeTest社区、Testin云测试社区、MeterSphere开源社区、掌动智能国产化社区、龙测社区、Eolink API社区、禅道项目管理软件社区、测试窝(排名不分先后)继续发起“2022年国内软件质量调查”。将在调查数据的基础上进行整理、分析和总结,最终发布一份高质量的软件质量调查分析报告。

https://activity.csdn.net/creatActivity?id=10272

1.关于软件质量的思考

在软件开发团队中,由于质量被视为软件产品的生命。那么什么是软件质量?软件质量:与软件产品满足明确或隐含需求的能力有关的特征和特征的总和,它反映了三个方面的问题:

1、能满足客户需求的特性之全体;

2、利用各种质量标准体系,指导软件开发人员开发软件;

3、是否满足用户隐含需求。软件质量管理的目的是建立对项目的软件产品质量的定量理解,和实现特定的质量目标;着重于确定软件产品的质量目标、制定达到这些目标的计划,并监控及调整软件计划、软件工作产品、活动及质量目标以满足顾客及最终用户对高质量产品的需要及期望。

2.软件质量管理的现状

在现实软件开发过程中,许多软件产品却时常陷入质量低下、甚至软件不符合用户需求的旋涡。究其根源,有以下几个方面:

1、软件质量保证技术(审查、复审和测试)没有贯穿到整个软件开发全过程中去。

2、在于这些软件产品对其质量内涵的把握,仅仅停留在减少软件运行错误、加强软件测试,避免软件缺陷的一般性层面,而对整个软件开发生命周期的全过程质量管理,缺乏总体架构。

3、测试管理的一些误区也会导致严重的质量问题。没有按照测试原则进行尽早测试、连续测试与自动化测试。是测试本省变得的形式化。

4、质量是全过程的,不仅是测试。质量管理者应该将质量控制与保证着眼于整个软件开发生存周期内。而事实上,质量管理者仅仅认为通过严格的测试就可以保证软件质量。

3.软件质量保证

1、在软件开发中,可以采用以下措施保证软件的质量;

2、审查。在生命周期每个阶段结束之前,都要使用标准对该阶段生产的软件配置进行严格的技术审查;

3、复查和管理复审。复查是检查已有的材料,以断定某阶段的工作是否能够开始或继续;管理复审是向开发组织或使用部门的管理人员,提供有关项目的总体状况、成本和进度等方面的情况,以便他们从管理角度对开发工作进行审查。

4、测试。通过测试计划、测试过程与测试结果对软件质量进行保证;

5、软件质量保证活动。以上各项活动内容都须写入质量保证计划,并由质量保证小组监督实施。由此可见,质量保证既是技术活动,也是管理活动;

6、软件评审。评审是以提高软件质量为目的的技术活动。要通过对软件的规格说明、可靠性、性能实现、可修改性、可扩充性、可移植性、可测试性、可复用性以及评审的实施等方面对软件项目做好严格的评审,以确保软件质量;

7、采用质量保证标准。质量标准用于实现质量管理的组织结构、责任、规程、过程和资源。采用ISO质量保证模型。可以用于质量计划、质量控制、质量保证和质量改经所需的组织结构、规程、过程和资源;

8、结构化的软件测试。经过严格的软件测试,尽可能找出软件计划、总体设计、详细设计、软件编码的错误,并加以纠正,才能提高软件的质量。测试要覆盖整个软件的生存周期,而不限于程序的编码阶段。

9、软件维护。采用结构化维护,完整的软件配置为基础,通过完善性维护、纠错性维护、适应性维护及预防性维护提高软件质量。

2.1 软件质量管理的检查方式:验证

验证的目的在于确保工作产品符合其指定的需求。

软件验证的过程可以抽象为以下3个部分:验证的准备工作、验证的执行工作、纠正措施。

所有验证准则都必须包含3个要素:输入、操作步骤和期望的输出。

书中提到验证的方法:

  • 同行评审
  • 单元测试
  • 集成测试
  • 性能测试(压力测试是检测在巨大的工作压力负荷下应用程序的运行情况。)
  • 系统测试

软件测试人员在进行验证的过程中也要把握尺度,通常所遵循原则如下:

①软件各种测试方法的目的是为了发现存在的缺陷,但永远不能证明软件系统不存在缺陷。因为软件产品对于测试人员来说就是一个“黑盒子”,而软件的缺陷却已经在生产的过程中产生了。

②要想在有限的时间和资源下进行无穷尽的测试是不可能的,因此软件测试也要适可而止。

③测试要尽早介入,由于软件的复杂性和抽象性,在软件生命周期各个阶段都可能产生错误,所以不应把软件测试仅仅看做是软件开发的一个独立阶段的工作,而应当把它贯穿到软件开发的各个阶段中。

④帕雷托的80/20原则,80%的缺陷是因为20%的错误原因导致的。

⑤相同的测试用例反复使用是没有效果的,因为测试人员也会产生“审美疲劳”。

3.一道有趣的测试面试题目:来思考“软件质量”

题目:在A文件夹下有多个子文件夹(a1、b1、c1),每个子文件夹下有好几张jpg图片,要求写一段代码(用PythonorShell),把这些图片全部拷贝并存在B文件夹下。

有趣的讨论:

  • 聪明的Cookie同学:考点就是如何遍历一个文件夹下的文件,需要考虑的是文件路径深度,需要用到递归。
  • 诚实的黑山老妖同学:我觉得对我来说,难点是操作文件的方法,之前没怎么用过,递归遍历啥的倒是小问题。
  • 经验老道的剪烛同学:如果拿这个题目面试测试工程师,这个肯定还需要你提问的(考你需求分析),不仅仅是说写个脚本,等你写完了(考你编程熟悉),还会让你针对你写的代码进行测试(考你用例设计),都是套路。
  • 爆炸的hellohell同学:我再想,如果我碰到这个问题,是否能当场给出正确答案?估计不成,因为API全忘掉了。确实记性不好。如果给我个本儿,给上网机会,多费点时间,能搞出来;甚至用了递归,生成器,精简了代码(篡成一行),做了判断。jpg是个目录咋办?不同目录下文件同名咋办?以及其他

python解答:

代码语言:javascript复制
import os,shutil
def movefile(srcfile,dstfile):
    fpath,fname=os.path.split(srcfile)
    if os.path.isfile(os.path.join(dstfile,fname)):
        print("%s exist!"%str(os.path.join(dstfile,fname)))
    elif not os.path.isfile(srcfile):
        print("%s not exist!")%(srcfile)
    else:
        fpath,fname=os.path.split(dstfile)
        if not os.path.exists(fpath):
            os.makedirs(fpath)
        shutil.move(srcfile,dstfile)
def getfile(path):
    paths = []
    for root, dirs, files in os.walk(path):
        for file in files:
            paths.append(os.path.join(root,file))
    return paths
def main():
    path = "/path/A"
    pathto = "/path/B"
    paths = getfile(path)
    for pathfrom in paths:
        print(pathfrom)
        movefile(pathfrom,pathto)
if __name__ == '__main__':
    main()

 java解答:

代码语言:javascript复制
public void copyImages(File from, File to) throws IOException {
    if(from == null || to == null) {
        throw new RuntimeException("From or To is empty.");
    }
    if(from.isFile()) {
        throw new RuntimeException("From is not directory.");
    }
    if(to.isFile()) {
        throw new RuntimeException("To is not directory.");
    }
    File[] images = from.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            boolean result = false;
            if(pathname.isFile()) {
                String path = pathname.getAbsolutePath().toLowerCase();
                if(path.lastIndexOf(".jpg") > -1
                    || path.lastIndexOf(".png") > -1
                    || path.lastIndexOf(".jpeg") > -1
                    || path.lastIndexOf(".bmp") > -1) {
                    result = true;
                }
            } else {
                result = false;
            }
            return result;
        }
    });
    for(File image : images) {
        copyImagesHelper(image, to);
    }
    File[] dirs = from.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory();
        }
    });
    for(File dir : dirs) {
        copyImages(from, to);
    }
}
private void copyImagesHelper(File image, File dir) throws IOException {
    String cmd =
        String.format("cp %s %s", image.getAbsolutePath(), dir.getAbsolutePath());
    Runtime runtime = Runtime.getRuntime();
    runtime.exec(cmd);
}

 shell解答:

代码语言:javascript复制
find  ./A/ -maxdepth 2  -name '*.jpg' -exec cp {} ./B ;

4.软件测试推荐书籍:把控“质量安全”

测试理论与实践:《软件测试经验与教训》《有效软件测试:提高测试水平的 50 条建议》《软件测试基础教程》《Google 测试之道:像 Google 一样进行软件测试》《探索吧!深入理解探索式软件测试》《实例化需求:团队如何交付正确的软件》《Scrum 要素》《海盗派测试分析》

性能测试:《性能之巅:洞悉系统、企业与云计算》《应用程序性能测试的艺术》《软件性能测试过程详解与案例剖析》

安全测试:《渗透测试实践指南:必知必会的工具与方法》

自动化测试:《自动化测试最佳实践》《测试之美》

编程语言与开发技能:《Effective Java(第3版)》《Java编程思想 (第4版)》《Python 核心编程(第三版)》《流畅的 Python》《算法(第4版)》《鸟哥的 Linux 私房菜》《SQL 必知必会》《正则表达式必知必会》《高性能 MySQL》《Spring 揭秘》

微服务、DevOps、持续交付:《微服务设计》《DevOps 实践指南》《持续交付1.0:发布可靠软件的系统方法》《持续交付2.0:业务引领的DevOps精要》

软件工程《软件开发心理学》《Head First 设计模式》《代码整洁之道》《架构整洁之道》《重构:改善既有代码的设计》《人月神话》

通用软技能:《程序员健康指南》《软技能 —— 代码之外的生存指南》《高效能人士的 7 个习惯》《金字塔原理》《学会提问》《非暴力沟通》

管理技能:《赢》《格鲁夫给经理人的第一课》《你的灯亮着吗?:发现问题的真正所在》《管理团队:成败启示录》《团队角色:在工作中的应用》

0 人点赞