测试 必问面经华子~

1、测试基础知识

测试定义:通过手工或者工具“被测对象”进行测试操作

测试目的:

  • 正向思维出发点:使自己确信产品是能够正常工作的评价一个程序和系统的特性或能力,并确定它是否达到期望的结果,软件测试就是以此为目的的任何行为。
  • 反向思维:测试是为发现错误而执行一个程序或者系统的过程,测试是为了证明程序有错,而不是证明程序无错误,一个好的测试用例在于它能发现以前未发现的错误,一个成功的测试是发现了以前未发现的错误的测试。

总之软件测试的目的是尽可能早的找出软件产品中潜藏的缺陷,并确保其得以修复!

测试原则:

1. 测试应基于客户需求

所有的测试工作都应该建立在满足客户需求的基础上,从客户角度来看,最严重的错误就是软件无法满足要求。

2. 测试要尽早进行

软件的错误存在于软件生命周期的各个阶段,因此应该尽早开展测试工作,把软件测试贯穿到软件生命周期的各个阶段中,这样测试人员能够尽早地发现和预防错误,降低错误修复的成本。尽早地开展测试工作有利于帮助测试人员了解软件产品的需求和设计,从而预测测试的难度和风险,制订出完善的计划和方案,提高测试的效率。

3. 穷尽测试是不可能的

由于时间和资源的限制,进行完全(各种输入和输出的全部组合)的测试是不可能的测试人员可以根据测试的风险和优先级等确定测试的关注点,从而控制测试的工作量,在测试成本、风险和收益之间求得平衡。

4. 遵循GoodEnough原则

GoodEnough原则是指测试的投入与产出要适当权衡,形成充分的质量评估过程,这个过程建立在测试花费的代价之上。测试不充分无法保证软件产品的质量,但测试投入过多会造成资源的浪费。随着测试资源投入的增加,测试的产出也是增加的,但当投入达到一定的比例后,测试的效果就不会明显增强了。因此在测试时要根据实际要求和产品质量考虑测试的投入,最好使测试投入与产出达到一个GoodEnough状态。

5. 测试缺陷要符合“二八”定理

缺陷的“二八”定理也称为Pareto原则、缺陷集群效应,一般情况下,软件80%缺陷会集中在20%模块中,缺陷并不是平均分布的。因此在测试时,要抓住主要矛盾,如果发现某些模块比其他模块具有更多的缺陷,则要投入更多的人力、精力重点测试这些模块以提高测试效率。

6. 避免缺陷免疫

我们都知道虫子的抗药性原理,即一种药物使用久了,虫子就会产生抗药性。而在软件测试中,缺陷也是会产生免疫性的。同样的测试用例被反复使用,发现缺陷的能力就会越来越差;测试人员对软件越熟悉越会忽略一些看起来比较小的问题,发现缺陷的能力也越差,这种现象被称为软件测试的“杀虫剂”现象。它主要是由于测试人员没有及时更新测试用例或者是对测试用例和测试对象过于熟悉,形成了思维定式。

测试对象:

  • 程序、数据、文档。

通常情况下软件测试工作的目的主要有:

  • 一是为发现程序的错误从而进行测试
  • 二是测试用以证明软件的程序存在错误,并非证明该程序不存在错误;
  • 三是好测试其功能在于可以发现以前没有发现的一些错误等等。因此,必须关注测试的具体目的,进行测试用例的选择时要遵循经济性原则。

关键要素:

软件测试的基本概念

软件测试是软件工程的一个环节,现在变得越来越重要。软件测试的基本概念如下:

1.为什么要进行软件测试:(软件测试存在缺陷)

2.什么是软件测试:验证和确认,找出bug

3.什么是软件缺陷:bug,从各个方面总结

4.软件测试的分类:分三个角度分类(测试方法、测试目标、测试对象)

5.软件测试工作范围(流程):组建测试团队、测试需要分析、制定测试计划(包括测试环境设计与搭建)、设计测试用例、执行测试用例、分析测试结果(找出问题,提出解决办法)、提高报告。

6.软件测试方法:黑白盒测试、动静测试、主动被动测试、形式化测试、基于风险测试、模糊测试、ALAC和随机测试等。

7.软件测试依据和规范(标准):测试过程模型(v、w、TMap等)

软件测试技术(测试方法具体操作):根据测试类型选择相应的测试工具或自己写代码等完成测试工作。例如性能测试就选lr或jmeter等完成测试目标。

2、测试自动化 pyhton 自动化测试框架

自动化框架及工具

  1. 概述

  • 功能测试不建议做自动化
  • 接口测试性价比最高
  • 接口测试可以做自动化

后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。

基于Python的互联网软件测试开发

PyUnit测试框架

使用 python 作为自动化编程语言,那么就自然的使用 pyunit 作为自动化测试框架了。

如下部分的内容主要来自于 pyunit 的官方文档,本文仅仅做了一些翻译和结构上的简单调整。这部分属于测试框架的基本原理和概念部分,在进行代码编写前,有必要进行了解。

python的单元测试框架 PyUnit,可以认为是 Java 语言下的单元测试框架 JUnit 的 Python 语言实现版本,甚至其作者之一 Kent Beck 就是 JUnit 的作者。

unittest要达到如下目标:

  • 支持自动化测试
  • 让所有的测试脚本共享 开启(setup)关闭(shutdown) 的代码
  • 可以通过集合(collections)的方式来组织测试用例脚本
  • 将所有的测试脚本从测试报告框架中独立出来

为了达到以上目标,unittest支持如下几个重要概念:

    • 测试装置(test fixture)

      为一个或者多个测试用例做一些准备工作,例如:连接一个数据库,创建一个目录,或者开启一个进程

    • 测试用例(test case)

      测试用例是测试行为的最小单元,通过对一些输入输出值的对比来进行测试检查

    • 测试套件(test suite)

      测试用例 或者 测试用例集合 聚合组织起来的集合。可以批量执行一个测试套件内所有的测试用例

    • 测试执行器(test runner)

      组织安排测试脚本执行活动的组件。测试执行器通过一些图形界面,文本界面或者返回一些特殊的值来展示测试脚本的测试结果。主要用于生成测试报告

3 基本示例

如下示例也来自于官方文档 basic_demo.py

# coding:utf-8
"""
基本的自动化测试脚本 basic_demo.py
"""
__author__ = 'zheng'
 
import unittest
 
 
class TestStringMethods(unittest.TestCase):
 
    def setUp(self):
        print 'init by setUp...'
 
    def tearDown(self):
        print 'end by tearDown...'
 
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
 
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
        self.assertTrue('Foo'.isupper())
 
    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)
 
 
if __name__ == '__main__':
    unittest.main()

虽然官方文档里面介绍了几种组织测试用例脚本的方式:

  1. 独立测试函数
  2. 单用例测试类
  3. 多用例测试类

不同的编写形态,会有不同的组织方式,具体的可以看官方文档。本文作者研究过官方文档后,最喜欢第三种方式 多用例测试类,也就是上面基本示例的方式,这种方式具有如下特点:

  • 测试类 继承于 unittest.TestCase
  • 一个测试类可以管理多个 测试脚本函数
  • 测试脚本函数名称需要以 test_ 开头
  • 一个测试类里面的所有的测试函数共享 setUp和tearDown函数

在控制台中运行此程序:

➜  src git:(master) ✗ python basic_demo.py
init by setUp...
Fend by tearDown...
init by setUp...
end by tearDown...
.init by setUp...
end by tearDown...
.
======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "basic_demo.py", line 24, in test_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (failures=1)
➜  src git:(master)

前面的基本例子的 main 函数采用的最简单的方式,直接运行所有的测试用例,并生成默认的文本报告。其实只需要对调用函数做一些简单的修改,可以将这些测试用例进行合理组织,并获取其实有用的数据信息,以便和信息系统进行集成,形成较好的扩展。

if __name__ == '__main__':
    # unittest.main()
    # 装载测试用例
    test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)
    # 使用测试套件并打包测试用例
    test_suit = unittest.TestSuite()
    test_suit.addTests(test_cases)
    # 运行测试套件,并返回测试结果
    test_result = unittest.TextTestRunner(verbosity=2).run(test_suit)
    #生成测试报告
    print("testsRun:%s" % test_result.testsRun)
    print("failures:%s" % len(test_result.failures))
    print("errors:%s" % len(test_result.errors))
    print("skipped:%s" % len(test_result.skipped))

运行后生成的输出为:

➜  src git:(master) ✗ python basic_demo.py
test_isupper (__main__.TestStringMethods) ... init by setUp...
FAIL
end by tearDown...
test_split (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok
test_upper (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok
 
======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "basic_demo.py", line 23, in test_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (failures=1)
testsRun:3
failures:1
errors:0
skipped:0

显然上面的输入结果已经将测试的结果进行了统计,这些数据都是一次测试活动中的重要指标,这些数据可以入库,和测试信息管理系统集成,后期生成仪表盘或者统计报表,形成稳定和产品测试线路图,这些都是和开发相关的了,在此不再多叙述了。

结合上面的具体例子,我们也可以找到上一节的理论部分对应的具体实现对象:

    • 测试装置(test fixture)

      由setUp函数来做初始化工作,由tearDown做销毁工作

    • 测试用例(test case)

      对应TestCase类,或者更细化的对应里面的测试脚本函数

    • 测试套件(test suite)

      对应TestSuite类

    • 测试执行器(test runner)

      对应TextTestRunner类

4 IDE工具

既然需要开发代码的生产力,那么就需要介绍一款IDE工具-- Pycharm。不可否认,它是目前最专注/专业的 Python 语言的 IDE 了。在对Pyunit 也有比较好的支持。

主要支持如下:

  • 可视化的编程开发(这是IDE的基本特点)

  • 对测试结果进行可视化的展示

  • 导出生成HTML的测试报告

    • 可视化控制用例执行(这个在开发调试阶段很方便,可以方便控制指定代码单元运行)

      让一个目录下的所有用命执行让单个文件内所有用例执行让单个文件内的单个用命执行

4.1 运行和调试

Pycharm 对测试脚本提供了灵活的运行和调试支持。

通过pycharm,开发人员可以不用编写main函数,就可以实现如下功能:

  • 运行一个文件下所有的测试类
  • 运行一个测试类的所有测试脚本
  • 运行一个测试类的某个测试脚本

其中 “运行一个测试类的某个测试脚本” 比较有用,适合在开发阶段快速地对单个脚本进行开发和运行调试。

使用方法:

  1. 将光标移动到测试函数内部
  2. 按下运行快捷键 ctrl+shift+F10 (Eclipse快捷键方案)

如果要断点调试,则使用Debug模式,即可对单个函数运行和断点调试了。

当然,也可以不必借用IDE,而通过对testSuit操作,也可以实现以上功能,但是IDE却提供了更灵活直接的选择。这只是一些IDE使用技巧,也不多述了。

4.2 结果可视化

对于前面提到的例子,如果选择在IDE中运行此程序,会看到如下效果:

img

可以看到全部运行通过。如果刻意将其中一个弄成不通过的,则会显示如下的结果:

img

4.3 生成测试报告

Pycharm也提供了测试结果报告的导出功能,在测试结果显示框上的一个功能按钮上。

img

导出结果如下:

img

当然,如果不考虑和信息系统集成,不考虑后续的仪表盘和测试统计工作,仅仅只是要生成报告,这个功能已经足够了。

一般情况下,做自动化测试和开发,上面的那些那些技能已经完全能够满足要求了,接下来要做的事情就是利用各种计算机基本知识,面对不断增加的业务需求,而不断地增加测试用例脚本了。

功能开发项目,原理都很简单,但是随着量的增加,都会形成规模,测试开发工程也是一样。

5 项目组织

之前对测试用例的 开发调试态 的工具进行了介绍。但是如果真正的要纳入到 持续集成 的自动化体系,就显然不能依赖于 IDE 了。而是使用python 语言的组织和调用方式了,比如:要有 main 函数来作为执行入口,等等。

详细的技术实现细节,在后面有机会,将再会写相应的文章进行介绍。

通过脱离IDE的项目组织方式,有如下优点:

  • 可以通过事件触发来执行所有脚本(能够成为 持续集成 流水线的一环节)
  • 可以将数据全部提出并进行自定义加工和处理(和测试信息系统集成,为质量分析系统提供数据源)

6 测试平台

关于如何自动化生成测试报告这个测试产物,现在有一些平台能够提供接口调用及报告展示和分享功能,详情参考:

http://www.jianshu.com/p/c5fa76cf87db

img

7 小结

本小部分的内容,主要是讲基于 python 语言的 自动化测试框架 pyunit的一些设计思想和基本使用示例。其实工具的使用方法很简单,但是如何利用好这些工具来进行软件生产,则需要其它的计算机技能了,在后续的文章中将会从工程方面和技术方面来对此框架的应用进行深入的扩展。

3、白盒测试基础理论和设计方法

基本的白盒测试静态分析方法

黑盒测试:

黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。

“黑盒”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,因此不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。

常用的黑盒测试方法有:等价类划分法;边界值分析法;因果图法;场景法;正交实验设计法;判定表驱动分析法;错误推测法;功能图分析法。

白盒测试:

白盒测试也称为结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序验证。白盒测试法检查程序内部逻辑结构,对所有的逻辑路径进行测试,是一种穷举路径的测试方法,但即使每条路径都测试过了,但仍然有可能存在错误。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序;穷举路径测试不可能检查出程序因为遗漏路径而出错;穷举路径测试发现不了一些与数据相关的错误。

白盒测试需要遵循的原则有:1. 保证一个模块中的所有独立路径至少被测试一次;2. 所有逻辑值均需要测试真(true)和假(false);两种情况;3. 检查程序的内部数据结构,保证其结构的有效性;4. 在上下边界及可操作范围内运行所有循环。

常用白盒测试方法:

静态测试:不用运行程序的测试,包括代码检查、静态结构分析、代码质量度量、文档测试等等,它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具(Fxcop)自动进行。

动态测试:需要执行代码,通过运行程序找到问题,包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。

白盒测试中的逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。六种覆盖标准发现错误的能力呈由弱到强的变化:

1.语句覆盖每条语句至少执行一次。

2.判定覆盖每个判定的每个分支至少执行一次。

3.条件覆盖每个判定的每个条件应取到各种可能的值。

4.判定/条件覆盖同时满足判定覆盖条件覆盖。

5.条件组合覆盖每个判定中各条件的每一种组合至少出现一次。

6.路径覆盖使程序中每一条可能的路径至少执行一次。

4、缺陷分析与管理

缺陷分析方法、缺陷管理,问题单级别定义

1.软件缺陷报告地基本组成元素包括

缺陷的编号、缺陷的标题、缺陷的基本信息、测试的软件和硬件环境、测试的软件版本、缺陷的类型、缺陷的严重程度、缺陷的处理优先级、缺陷的复现步骤、缺陷的实际结果描述、期望的正确结果、截取的缺陷图像、注释文字 等

2.缺陷地状态主要包括

激活(新建/打开)、已修复、关闭、从新打开、推迟、不能复现、重复、不是缺陷

3.缺陷地严重程度主要包括

致命的、 严重的、一般的、较小的、建议性的

4.什么是软件缺陷?

所谓软件缺陷,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。IEEE729-1983对缺陷有一个标准的定义:从产品内部看,缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,缺陷是系统所需要实现的某种功能的失效或违背。

5.怎么判断是不是软件缺陷?

用户体验不好

界面上有明显的错误信息

功能不完备,导致功能缺失

功能不完善

逻辑不正确,与需求说明书不符

模块之间的交互性不好,与其他的模块做集成性测试时遇到问题

程序的性能不够好,不能承载压力考验

6.软件缺陷必须符合哪5个原则?

软件未达到产品说明书表明的功能

软件出现了产品说明书指明不会出现的错误

软件功能超出了产品说明书指明范围

软件未达到产品说明书虽然未指明但应达到的目标

软件测试人员认为难以理解、不易使用、运行速度缓慢、或者最终用户觉得不好

7.缺陷地产生主要原因有哪些原因?最主要地原因是什么?

没有编写说明书、设计、编码、其他

没有编写说明书

8.当你发现一个缺陷时,应该怎么确认的确是一个缺陷?

首先,可以将软件需求说明书、用户手册以及联机帮助作为识别和判断缺陷的辅助工具。

其次,通过增加自己对测试软件产品的行业背景知识的了解来发现被忽视的问题。

最后,通过沟通的方式来收集、学习和分享其他人判断缺陷的方法和经验。

9.正式提交一个缺陷前,你应该做什么?

再次确认是否是缺陷,记录下缺陷查收的每一个步骤(在现缺陷),编写缺陷报告,提交缺陷

10.怎么处理无法在现的缺陷?

首先,应当对这样的缺陷进行详细的记录,并尽快提交给开发人员

其次,对于寻找难以再现的缺陷要合理的安排时间

最后,在测试过程中对未在现缺陷予以关注

11.什么是重复缺陷?怎么避免重复缺陷?

指在统计周期再次发生的同类型缺陷。

一个人测试可以在提交的时候输入关键字进行筛选一下。

多人测试尽量分模块进行测试,提交之前都应该筛选一下。避免重复提交。

12什么是无效缺陷?怎么避免无效缺陷?

软件产品中不符合用户需求的地方即可认定为软件缺陷(Bug)。这里软件产品可以是代码段、应用程序、软件系统、产品文档等任何软件工程行为的产品。

前细化需求,保证对需求理解正确,避免提交存在歧义的缺陷:

对于自己把握不准的缺陷,提交前进行讨论

在提交bug之前,一定要保证bug能够重现,并且在bug中清楚的描述重现步骤

保证测试环境的准确性,并且做好版本的配置管理

13.什么是缺陷报告?有哪些用途?

用于记录缺陷,对缺陷进行分类,为解决不同的缺陷分配合理的资源,并通过缺陷报告对处理缺陷的过程进行跟踪,从而使软件缺陷得以修复。

记录缺陷、缺陷分类、缺陷跟踪几大用途

14.缺陷报告的5个写作准则是什么?

准确、清晰、简洁、完整、一致 (5C原则)

15.缺陷报告的内容有哪些?

缺陷的编号、缺陷的标题、缺陷的基本信息、测试的软件和硬件环境、测试的软件版本、缺陷的类型、缺陷的严重程度、缺陷的优先处理级、缺陷的复现步骤、缺陷的实际结果描述、期望的正确结果描述、截取的缺陷图像、注释文字

16.缺陷报告的组织结构是什么?

缺陷的编号、缺陷的标题、缺陷的基本信息、测试的软件和硬件环境、测试的软件版本、缺陷的类型、缺陷的严重程度、缺陷的优先处理级、缺陷的复现步骤、缺陷的实际结果描述、期望的正确结果描述、截取的缺陷图像、注释文字

17.缺陷报告的写作需要注意什么问题?

自我检查和提问:

缺陷报告已经向读者包含完整、准确、必要的信息了吗? 一个缺陷报告是否只报告了一种缺陷?步骤可以完全复现而且表达清除吗? 实际结果和期望结果是否描述准确等

避免常见的错误:

不要“我”“你”而用动词或者必要时使用“用户”代替

不要使用模糊词汇“似乎”“大概”等

不要对软件的质量优劣做任何的主观性强的批评和嘲讽

不确定的缺陷测试问题不要放在缺陷管理数据库。

18.缺陷的分类?

测试过程中发现的缺陷一般分为如下几类:

代码问题:不满足需求、功能实现错误;对产品或项目质量有影响的bug可统一划入;

设计缺陷:页面美观性、协调性、错别字等

用户体验:对产品、项目的建议性意见,不强制要求修改

性能问题:进行性能测试时使用,暂定:网络延时、内存问题、CPU占用、硬盘问题

安全问题:业务功能存在的安全问题

接口问题: 涉及有模块间数据传递时使用

配置问题: 由于提供的配置不当或者配置不能够满足实际要求而出现的问题

缺陷错误严重程度:

5级-建议问题的软件缺陷(Enhancemental):由问题提出人对测试对象的改进意见或测试人员提出的建议、质疑。

4级—较小错误的软件缺陷(Minor),使操作者不方便或遇到麻烦,但它不影响功能过的操作和执行,如错别字、界面不规范(字体大小不统一,文字排列不整齐,可输入区域和只读区域没有明显的区分标志),辅助说明描述不清楚。

3级—一般错误的软件缺陷(major):次要功能没有完全实现但不影响使用。如提示信息不太准确,或用户界面差,操作时间长,模块功能部分失效等,打印内容、格式错误,删除操作未给出提示,数据库表中有过多的空字段等。

2级—严重错误的软件缺陷(critical):系统的主要功能部分丧失、数据不能保存,系统的次要功能完全丧失。问题局限在本模块,导致模块功能失效或异常退出。如致命的错误声明,程序接口错误,数据库的表、业务规则、缺省值未加完整性等约束条件

1级—致命的软件缺陷(Fatal):造成系统或应用程序崩溃、死机、系统挂起,或造成数据丢失,主要功能完全丧失,导致本模块以及相关模块异常等问题。如代码错误,死循环,数据库发生死锁、与数据库连接错误或数据通讯错误,未考虑异常操作,功能错误等。

19.如果测试提交的缺陷开发人员不认可怎么办?

第一步:与开发人员反复友好沟通;

第二步:反复复现缺陷的存在,并可以将缺陷复现的截图与复现步骤整理成文档提供给开发人员;

第三步:如果还是不能说服开发人员,可以将该情况反映给测试组长或者测试经理,由测由测试组长或者测试经理评估协调。

20.简述缺陷的生命周期。

1.New 新建

  1. Open 打开

  2. Assign 指派

  3. Test 测试

  4. Verified 确认

  5. Deferred 延期

  6. Reopened 重新打开

  7. Duplicate 重复

  8. Rejected 拒绝

  9. Closed 关闭

21.缺陷按照严重程度可以分为哪些类型?

缺陷错误严重程度:

5级-建议问题的软件缺陷(Enhancemental):由问题提出人对测试对象的改进意见或测试人员提出的建议、质疑。

4级—较小错误的软件缺陷(Minor),使操作者不方便或遇到麻烦,但它不影响功能过的操作和执行,如错别字、界面不规范(字体大小不统一,文字排列不整齐,可输入区域和只读区域没有明显的区分标志),辅助说明描述不清楚。

3级—一般错误的软件缺陷(major):次要功能没有完全实现但不影响使用。如提示信息不太准确,或用户界面差,操作时间长,模块功能部分失效等,打印内容、格式错误,删除操作未给出提示,数据库表中有过多的空字段等。

2级—严重错误的软件缺陷(critical):系统的主要功能部分丧失、数据不能保存,系统的次要功能完全丧失。问题局限在本模块,导致模块功能失效或异常退出。如致命的错误声明,程序接口错误,数据库的表、业务规则、缺省值未加完整性等约束条件

1级—致命的软件缺陷(Fatal):造成系统或应用程序崩溃、死机、系统挂起,或造成数据丢失,主要功能完全丧失,导致本模块以及相关模块异常等问题。如代码错误,死循环,数据库发生死锁、与数据库连接错误或数据通讯错误,未考虑异常操作,功能错误等。

22.缺陷按照优先级可以分为哪些类型

img

5、安全与隐私保护

网络安排红线测试,安全测试工具,linux安全测试,隐私保护

安全测试工具

  1. AppScan
    一款安全漏洞扫描工具,支持Web和移动,现在安全测试做漏洞扫描非常适用,它相当于是"探索"和"测试"的过程,最终生成很直观的测试报告,有助于研发人员分析和修复通常安全测试工具用这个,扫描一些安全漏洞,用起来比较方便,网上资料比较多,适合很多测试同学用,资料广阔,大家可以尝试下。
    官网:https://www.ibm.com/developerworks/downloads/r/appscan/
    参考:https://www.cnblogs.com/benpao1314/p/8065720.html

  2. Burp Suite
    一款信息安全从业人员必备的集 成型的渗透测试工具,它采用自动测试和半自动测试的方式,包含了 Proxy,Spider,Scanner,Intruder,Repeater,Sequencer,Decoder,Comparer等工具模块;Proxy功能可以拦截HTTP/S的代理服务器(手机和web);Spide功能-智能感应的网络爬虫;Intruder功能可以对web应用程序进行自动化攻击等,非常适合做安全测试。通 过拦截HTTP/HTTPS的web数据包,充当浏览器和相关应用程序的中间人,进行拦截、修改、重放数据包进行测试,是web安全人员的一把必备的瑞士军刀。
    官网:https://portswigger.net/burp/
    参考:https://www.cnblogs.com/nieliangcai/p/6692296.html

  3. Acunetix
    一款网络漏洞扫描软件,它可以检测网络的安全漏洞。
    官网:https://www.acunetix.com/

  4. Nmap
    一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。
    官网:https://nmap.org/
    参考:https://blog.csdn.net/m0_37268841/article/details/80404613

  5. sqlmap
    一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
    官方网站:http://sqlmap.org/,
    下载地址:https://github.com/sqlmapproject/sqlmap/zipball/master
    演示视频:https://asciinema.org/a/46601
    教程:http://www.youtube.com/user/inquisb/videos
    参考:https://www.freebuf.com/sectool/164608.html

  6. OpenVAS
    一个开放式漏洞评估系统,也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器,包括一套网络漏洞测试程序,可以检测远程系统和应用程序中的安全问题。OpenVas服务端只允许安装在Linux系统上,接下来我们来介绍一下使用二进制搭建OpenVas的方法以及基础的使用。
    官网:http://www.openvas.org/
    参考:https://www.freebuf.com/column/158357.html

  7. msfvenom
    参考:https://www.offensive-security.com/metasploit-unleashed/msfvenom/

  8. fortify
    静态代码检查工具
    官网:http://www.fortify.net/README.html
    参考:https://www.cnblogs.com/eyesmoon/p/7421477.html
    参考:https://www.freebuf.com/sectool/95683.html

  9. Drozer
    MWR Labs开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一。官网:https://labs.mwrinfosecurity.com/publications/
    参考:https://www.cnblogs.com/lsdb/p/9441813.html

  10. nessus
    一款号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控,进行系统的漏洞分析扫描。Nessus也是渗透测试重要工具之一。所以,本章将介绍安装、配置并启动Nessus。
    官网:https://www.tenable.com/downloads/nessus
    参考:https://www.cnblogs.com/cheyunhua/p/8084459.html

  11. zap
    OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者*积极维护。它可以帮助您在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。
    官网:https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project
    参考:https://www.fujieace.com/kali-linux/owasp-zed-zap.html

linux安全测试

一、账户检查

cat /etc/passwd
grep :0: /etc/passwd    #检查是否产生了新用户,和UID、GID是0的用户
ls -l /etc/passwd      #查看文件修改日期
awk -F: ‘$3= =0 {print $1}’ /etc/passwd          #查看是否存在特权用户
awk -F: ‘length($2)= =0 {print $1}’ /etc/shadow  #查看是否存在空口令帐户

二、检查系统守护进程

定位导致高流量的进程, 然后通过它的行为, 分析是否是黑客挂的马

iftop -nP  查看流量情况

如先用iptraf-ng查下,如果UDP包发的很多,基本都被人装了后门

top (ps -ef)      #查看进程
lsof –c 可疑进程名  #查看关联文件,发现对外的 tcp 连接

查看文件路径。并查看文件创建时间
whereis  可疑进程名
ls -al   可疑进程名
ps -aux(注意UID是0的)
lsof -p pid(察看该进程所打开端口和文件)
cat /etc/inetd.conf | grep -v “^#”    #(检查守护进程)

检查隐藏进程
ps -ef|awk{print }|sort -n|uniq >1
ls /porc |sort -n|uniq >2
diff 1 2

三、检查网络连接和监听端口

netstat 命名全局

netstat –an
netstat –rn
ifconfig –a
netstat 简介 面试必问

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

常见参数

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

实用命令实例

1. 列出所有端口 (包括监听和未监听的)

列出所有端口 netstat -a

# netstat -a | more
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 udp        0      0 *:bootpc                *:*
 
Active UNIX domain sockets (servers and established)
 Proto RefCnt Flags       Type       State         I-Node   Path
 unix  2      [ ACC ]     STREAM     LISTENING     6135     /tmp/.X11-unix/X0
 unix  2      [ ACC ]     STREAM     LISTENING     5140     /var/run/acpid.socket

列出所有 tcp 端口 netstat -at

# netstat -at
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 tcp        0      0 localhost:ipp           *:*                     LISTEN
 tcp        0      0 *:smtp                  *:*                     LISTEN
 tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

列出所有 udp 端口 netstat -au

# netstat -au
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 udp        0      0 *:bootpc                *:*
 udp        0      0 *:49119                 *:*
 udp        0      0 *:mdns    

2. 列出所有处于监听状态的 Sockets

只显示监听端口 netstat -l

# netstat -l
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:ipp           *:*                     LISTEN
 tcp6       0      0 localhost:ipp           [::]:*                  LISTEN
 udp        0      0 *:49119                 *:*

只列出所有监听 tcp 端口 netstat -lt

# netstat -lt
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 tcp        0      0 *:smtp                  *:*                     LISTEN
 tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

只列出所有监听 udp 端口 netstat -lu

# netstat -lu
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 udp        0      0 *:49119                 *:*
 udp        0      0 *:mdns                  *:*

只列出所有监听 UNIX 端口 netstat -lx

# netstat -lx
 Active UNIX domain sockets (only servers)
 Proto RefCnt Flags       Type       State         I-Node   Path
 unix  2      [ ACC ]     STREAM     LISTENING     6294     private/maildrop
 unix  2      [ ACC ]     STREAM     LISTENING     6203     public/cleanup
 unix  2      [ ACC ]     STREAM     LISTENING     6302     private/ifmail
 unix  2      [ ACC ]     STREAM     LISTENING     6306     private/bsmtp

3. 显示每个协议的统计信息

显示所有端口的统计信息 netstat -s

# netstat -s
 Ip:
 11150 total packets received
 1 with invalid addresses
 0 forwarded
 0 incoming packets discarded
 11149 incoming packets delivered
 11635 requests sent out
 Icmp:
 0 ICMP messages received
 0 input ICMP message failed.
 Tcp:
 582 active connections openings
 2 failed connection attempts
 25 connection resets received
 Udp:
 1183 packets received
 4 packets to unknown port received.
 .....

显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su

# netstat -st 
# netstat -su

4. 在 netstat 输出中显示 PID 和进程名称 netstat -p

netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。

# netstat -pt
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
 tcp        1      0 ramesh-laptop.loc:47212 192.168.185.75:www        CLOSE_WAIT  2109/firefox
 tcp        0      0 ramesh-laptop.loc:52750 lax:www ESTABLISHED 2109/firefox

5. 在 netstat 输出中不显示主机,端口和用户名 (host, port or user)

当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。

同样可以加速输出,因为不用进行比对查询。

# netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令

# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users

6. 持续输出 netstat 信息

netstat 将每隔一秒输出网络信息。

# netstat -c
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 ramesh-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED
 tcp        1      1 ramesh-laptop.loc:52564 101.11.169.230:www      CLOSING
 tcp        0      0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED
 tcp        1      1 ramesh-laptop.loc:42367 101.101.34.101:www      CLOSING
 ^C

7. 显示系统不支持的地址族 (Address Families)

netstat --verbose

在输出的末尾,会有如下的信息

netstat: no support for `AF IPX' on this system.
netstat: no support for `AF AX25' on this system.
netstat: no support for `AF X25' on this system.
netstat: no support for `AF NETROM' on this system.

8. 显示核心路由信息 netstat -r

# netstat -r
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
 192.168.1.0     *               255.255.255.0   U         0 0          0 eth2
 link-local      *               255.255.0.0     U         0 0          0 eth2
 default         192.168.1.1     0.0.0.0         UG        0 0          0 eth2

注意: 使用 netstat -rn 显示数字格式,不查询主机名称。

9. 找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

# netstat -ap | grep ssh
 tcp        1      0 dev-db:ssh           101.174.100.22:39213        CLOSE_WAIT  -
 tcp        1      0 dev-db:ssh           101.174.100.22:57643        CLOSE_WAIT  -

找出运行在指定端口的进程

# netstat -an | grep ':80'

10. 显示网络接口列表

# netstat -i
 Kernel Interface table
 Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
 eth0       1500 0         0      0      0 0             0      0      0      0 BMU
 eth2       1500 0     26196      0      0 0         26883      6      0      0 BMRU
 lo        16436 0         4      0      0 0             4      0      0      0 LRU

显示详细信息,像是 ifconfig 使用 netstat -ie:

# netstat -ie
 Kernel Interface table
 eth0      Link encap:Ethernet  HWaddr 00:10:40:11:11:11
 UP BROADCAST MULTICAST  MTU:1500  Metric:1
 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 Memory:f6ae0000-f6b00000

11. IP和TCP分析

查看连接某服务端口最多的的IP地址

wss8848@ubuntu:~$ netstat -nat | grep "192.168.1.15:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
18 221.136.168.36
3 154.74.45.242
2 78.173.31.236
2 62.183.207.98
2 192.168.1.14
2 182.48.111.215
2 124.193.219.34
2 119.145.41.2
2 114.255.41.30
1 75.102.11.99

TCP各种状态列表

wss8848@ubuntu:~$ netstat -nat |awk '{print $6}'
established)
Foreign
LISTEN
TIME_WAIT
ESTABLISHED
TIME_WAIT
SYN_SENT
  先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。
wss8848@ubuntu:~$ netstat -nat |awk '{print $6}'|sort|uniq -c
143 ESTABLISHED
1 FIN_WAIT1
1 Foreign
1 LAST_ACK
36 LISTEN
6 SYN_SENT
113 TIME_WAIT
1 established)

四、查看正常情况下登录到本机的所有用户的历史记录

last

五、检查系统中的 core 文件

find / -name core -exec ls -l {} \;

六、 查看系统、文件异常

find -type f -mtime -5 #查找最近5天内更改的文件
find / -uid 0 –perm -4000 –print
find / -size +10000k –print
find / -name "..." –print
find / -name ".." –print
find / -name "." –print
find / -name " " –print    #注意SUID文件,可疑大于10M和空格文件
find / -name core -exec ls -l {} ;  #(检查系统中的core文件)
检查系统文件完整性
md5sum –b 文件名
md5sum –t 文件名

七、检查系统文件完整性

rpm –qf /bin/ls
rpm -qf /bin/login
md5sum –b 文件名
md5sum –t 文件名

八、后门扫描

后门账户检查
cat /etc/passwd
grep :0: /etc/passwd    #检查是否产生了新用户,和UID、GID是0的用户
ls -l /etc/passwd       #查看文件修改日期
awk -F: ‘$3= =0 {print $1}’ /etc/passwd  #查看是否存在特权用户
awk -F: ‘length($2)= =0 {print $1}’ /etc/shadow  #查看是否存在空口令帐户
后门检查
cat /etc/crontab
ls /var/spool/cron/
cat /etc/rc.d/rc.local
ls /etc/rc.d
ls /etc/rc3.d
find / -type f -perm 4000

STABLISHED
1 FIN_WAIT1
1 Foreign
1 LAST_ACK
36 LISTEN
6 SYN_SENT
113 TIME_WAIT
1 established)


### 四、查看正常情况下登录到本机的所有用户的历史记录

```shell
last

五、检查系统中的 core 文件

find / -name core -exec ls -l {} \;

六、 查看系统、文件异常

find -type f -mtime -5 #查找最近5天内更改的文件
find / -uid 0 –perm -4000 –print
find / -size +10000k –print
find / -name "..." –print
find / -name ".." –print
find / -name "." –print
find / -name " " –print    #注意SUID文件,可疑大于10M和空格文件
find / -name core -exec ls -l {} ;  #(检查系统中的core文件)
检查系统文件完整性
md5sum –b 文件名
md5sum –t 文件名

七、检查系统文件完整性

rpm –qf /bin/ls
rpm -qf /bin/login
md5sum –b 文件名
md5sum –t 文件名

八、后门扫描

后门账户检查
cat /etc/passwd
grep :0: /etc/passwd    #检查是否产生了新用户,和UID、GID是0的用户
ls -l /etc/passwd       #查看文件修改日期
awk -F: ‘$3= =0 {print $1}’ /etc/passwd  #查看是否存在特权用户
awk -F: ‘length($2)= =0 {print $1}’ /etc/shadow  #查看是否存在空口令帐户
后门检查
cat /etc/crontab
ls /var/spool/cron/
cat /etc/rc.d/rc.local
ls /etc/rc.d
ls /etc/rc3.d
find / -type f -perm 4000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值