软件测试概述(精选10篇)
软件测试概述 篇1
0简介
在开发软件的过程中, 人们使用了许多保证软件质量的方法分析、设计和实现软件, 但难免在工作中犯错误。这样, 在软件产品中就会隐藏许多错误和缺陷。对于规模大、复杂性高的软件更是如此。在这些错误中, 有些是致命的错误, 如果不排除, 就会导致生命与财产的重大损失。这种情况迫使人们必须认真计划、彻底地进行软件测试[3,6]。
为了保证软件的质量和可靠性, 应力求在分析、设计等各个开发阶段结束前, 对软件进行严格的技术评审。但由于人们能力的局限性, 审查不能发现所有的错误。而且在编码阶段还会引进大量的错误。这些错误和缺陷如果遗留到软件交付投入运行之时, 终将会暴露出来。但到那时, 不仅改正这些错误的代价更高, 而且往往造成很恶劣的后果。
软件测试就是在软件投入运行前, 对软件需求分析、设计规格说明和编码的最终审查, 是软件质量保证的关键步骤。如果给软件测试下定义, 可以这样讲:软件测试是为了发现错误而执行程序的过程。或者说, 软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例 (即输入数据和预期的结果) , 并利用这些测试用例去运行程序, 以发现错误的过程[1,2]。
软件测试在软件生存期中横跨两个阶段:通常在编写出每一个模块之后就对它做必要的测试 (称为单元测试) 。编码与单元测试属于软件生存期中的同一阶段。在结束这个阶段后, 对软件系统还要进行各种综合测试, 这是软件生存期的另一阶段, 即测试阶段。
现在, 软件开发机构将研制力量的40%以上投入到软件测试之中的事例越来越多。特殊情况下, 对于性命攸关的软件, 例如飞行控制、核反应堆监控软件等, 其测试费用甚至高达所有其他软件工程阶段费用的总和的3~5倍。
1 软件测试的目的和原则
基于不同的立场, 存在着两个不同的测试目的。从用户的角度出发, 普遍希望通过软件测试暴露软件中隐藏的错误和缺陷, 以考虑是否接受该产品。而从软件开发者的角度出发, 则希望测试成为表明软件产品中不存在错误的过程, 验证该软件已正确第实现了用户的要求, 确立人们对软件质量的信心。因此, 他们会选择那些导致程序失效概率小的测试用例, 回避那些易于暴露程序错误的测试用例。同时, 也不会着意去检测、排除程序中可能包含的副作用。显然, 这样的测试对完善和提高软件的质量毫无价值。因为在程序中存在着许多预料不到的问题, 可能会被疏漏, 许多隐藏的错误只有在特定的环境下才能暴露出来。如果不把着眼点放在尽可能查找错误这样一个基础上, 这些隐藏的错误和缺陷就查不出来, 会遗留到运行阶段中去。如果站在用户的角度, 替他们设想, 就应当把测试活动的目标对准揭露程序中的错误。在选取测试用例时, 考虑那些易于发现程序错误的数据。
有鉴于此, Grenford J.Myers就软件测试的目的提出以下观点:
(1) 测试是程序的执行过程, 目的在于发现错误;
(2) 一个好的测试用例在于能发现至今未发现的错误;
(3) 一个成功的测试用例是发现了至今未发现的错误的用例。
测试的目标是以最少的时间和人力找出软件中潜在的错误和缺陷。如果成功地实现了测试, 就能够发现软件中的错误。测试的附带收获是, 它能够证明软件的功能和性能与需求说明相符。此外, 实施测试收集到的测试结果数据为可靠性分析提供了依据[4,5]。
根据这样的测试目的, 软件测试的原则是:
(1) 应当把“尽早地和不断地进行软件测试 (Check early, check often) ”作为软件开发者的座右铭。
由于原始问题的复杂性, 软件的复杂性和抽象性, 软件开发各个阶段工作的多样性, 以及参加开发各种层次人员之间工作的配合关系等因素, 使得开发的每个环节都可能产生错误。所以不应该把软件测试仅仅看作是软件开发的一个独立阶段, 而应当把它贯穿到软件开发的各个阶段中。坚持在软件开发的各个阶段的技术评审, 这样才能在开发过程中尽早发现和预防错误, 把出现的错误克服在早期, 杜绝某些隐患, 提高软件质量。
(2) 测试用例应由测试输入数据和对应的预期输出结果这两部分组成。
测试以前应当根据测试的要求选择在测试过程中使用的测试用例。测试用例主要用来检查程序员编制的程序, 因此不但需要测试的输入数据, 而且需要针对这些输入数据的预期输出结果。如果对测试输入数据没有给出预期的输出结果, 那么就缺少了检验实测结果的基准, 就有可能把一个似是而非的错误结果当成正确结果。
(3) 程序员应避免检查自己的程序。
测试工作需要严格的作风、客观的态度和冷静的情绪。人们常由于各种原因具有一种不愿否定自己工作的心理, 认为揭露自己程序中的问题总不是一件愉快的事。这一心理状态就成为测试自己程序的障碍。另外, 程序员对软件规格说明理解错误而引入的错误更难发现。如果由别人来测试程序员编写的程序, 可能会更客观, 更有效, 并更容易取得成功。要注意的是, 这点不能与程序的调试相混淆。调试由程序员自己来做可能更有效[7,8]。
(4) 在设计测试用例时, 应当包括合理的输入条件和不合理的输入条件。
合理的输入条件是指能验证程序正确的输入条件, 而不合理的输入条件是指异常的, 临界的, 可能是引起问题异变的输入条件。在测试程序时, 人们常常过多地考虑合法的和期望的输入条件, 以检查它是否做了它应该做的事情, 而忽视了不合法的和预想不到的输入条件。事实上, 软件在投入运行后, 用户的使用往往不遵循事先的约定, 使用了一些意外的输入, 如用户在键盘上按错了键或打入了非法的命令, 如果开发的软件遇到这种情况时不能作出适当的反应, 给出相应的信息, 那么就容易产生故障, 轻则给出错误的结果, 重则导致软件失效。因此, 系统软件处理非法命令的能力也必须在测试时受到检验。用不合理输入条件测试程序时, 往往比用合理的输入条件进行测试能发现更多的错误。
(5) 充分注意测试中的群集现象。
测试时不要以为找到了几个错误问题就已解决, 不需要测试了。经验表明, 测试后程序中残存的错误数目与该程序中已发现的错误数目或检错率成正比。根据这个规律, 应当对错误群集的程序进行重点测试, 以提高测试投资的效益。
在所测试程序段中, 若发现错误数目多, 则残存数目也较多。这种错误群集性现象, 已为许多程序的测试实践所证实。这种现象对测试很有用。如果发现某一程序模块似乎比其它程序模块有更多的错误倾向时, 则应当花费较多的时间和代价来测试这个程序模块。
(6) 严格执行测试计划, 排除测试的随意性。
测试计划应包括:所测试软件的功能, 输入和输出, 测试内容, 各项测试的进度安排, 资源要求, 测试资料, 测试工具, 测试用例的选择, 测试的控制方式和过程, 系统组装方式, 跟踪规程, 调试规程, 以及回归测试的规定等以及评价标准。
对测试计划, 要明确规定, 不要随意解释。
(7) 应当对每一个测试结果做全面检查。
这是一条最明显的原则, 但常常被忽视。有些错误的征兆在输出实测结果时已经明显地出现了, 但是如果不仔细地全面地检查测试结果, 就会使这些错误被遗漏掉。所以必须对预期的输出结果明确定义, 对实测的结果仔细分析检查, 抓住征候, 暴露错误。
(8) 妥善保存测试计划, 测试用例, 出错统计和最终分析报告, 为维护提供方便。
测试可以采用自顶向下或自底向上进行, 自顶向下测试先从全系统开始, 再测试每个子模块;自底向上测试先从子模块测试开始, 逐步测试各子模块的父模块, 最后进行全系统综合测试。模块测试的目的是验证是否和规格相符。
进行模块测试必须考虑两件事:测试用例的设计和测试模块的规模。测试用例可从规格或分析模块代码产生, 相应的测试策略分为黑盒测试和白盒测试, 并有两种方法和它们进行组合———非增量与增量测试。非增量测试分别对每个模块进行测试, 然后组装成系统, 不再进一步测试;而增量测试对每一个模块和被测试过的模块进行组合测试。增量测试能更早地检测出错误。自顶向下或自底向上测试它们均基于这样的假设:模块的调用关系为有向无环图。
线索测试是一种增量测试方法, 它的基础是从需求变化而来的系统验证图。另一种测试策略认为测试应从软件开发的早期开始。
2 测试标准
在对系统进行验证中, 规格作为对代码进行验证的标准。程序必须满足两种规格:一是需求标准, 它描述系统的自然功能 (What) ;二是设计标准, 它描述系统的逻辑 (How) 。因此, 需要发现两类错误:其一是功能错误, 它偏离了需求规格;其二是设计实现错误, 即逻辑错误。理想情况下, 需求规格是明晰的、完备的、简明的、可以理解的, 并且不存在二义性。但实际上, 需求规格几乎总是不完备的、模棱两可的、易于变化的。因此, 一个软件系统可以被验证 (满足需求规格) , 但仍存在不满足要求的部分, 因为规格本身是不完备的、模棱两可的、甚至是错误的。软件验证中的许多问题是因错误的规格引起的。并且由于代码的规模、复杂性, 以及软件本身的进化规律使得软件开发满足规格是困难的, 有时甚至是不可能的[9]。
3 验证
存在两种系统验证:一是系统发布前进行的;二是对系统进行维护时。系统验证一般是由与开发小组独立的小组完成的, 其中一至两人充当质量控制经理与组内其他人员独立。
尽管70%的精力花在对系统的维护上, 但系统的重新验证仍未被重视。有两个理由使得重新验证是必要的:一是修正错误;二是修改系统的能力。重新验证检验修正是否正确、修改是否实现, 以及修改是否对系统的其它方面产生影响。完善的文档、功能局部化以及良好的模块定义使得重新验证较为容易一些[10]。
4 黑盒测试
在黑盒测试 (或称功能测试) 中, 不考虑程序的内部结构和表现, 其目的是确定程序的输入与输出是否与其规格一致, 力图发现以下几类错误:
是否有不正确或遗漏了的功能?
在接口上, 输入能否正确地接受?能否正确地输出结果?
是否有数据结构错误或外部信息 (例如数据文件) 访问错误?
性能上是否能满足要求?
是否有初始化或终止性错误?
黑盒测试的主要缺点是依赖于规格的正确性 (实际情况并非如此) 和需要采用所有可能的输入作为测试用例才能保证模块的正确性。
5 白盒测试
在该方法对软件的过程性细节做细致检查, 对程序所有逻辑进行测试。通过在不同点检查程序的状态, 确定实际的状态是否与预期的状态一致。测试用例从程序的逻辑中产生。确定程序逻辑覆盖有几条原则, 其中之一是语句覆盖, 要求程序中的每条语句至少执行一次。这条原则是必要的, 但不充分, 因为部分错误并不能检测出来。
6 从上至下测试
从上至下测试从程序的顶点模块开始, 然后逐步对较低级的模块进行测试。为了模仿被测试模块的低级模块, 需要哑模块或桩子模块。
从上至下测试的主要好处就是排除了系统测试和集成, 它可以让人们看见系统的早期版本并证明系统的正确性。它的效果之一可以提高程序员的士气。
从上至下测试的主要缺点是需要桩子模块, 并且在桩子模块中的测试数据直到输入输出模块加入之前不能确定。某些模块的测试数据难以创建, 因为桩子模块不能模拟数据流使得模块之间的数据流不能组织成有向无环图。
7 从下至上测试
从下至上测试策略从程序的最低级模块 (不调用别的模块) 开始。为了模拟高一级的模块需要驱动模块。当对所有的低一级模块测试完毕才对高一级模块进行测试。
从下至上测试方法的优点之一是测试数据的建立不存在困难。尽管数据流不在有向无环图中, 但驱动模块模拟所有的调用参数, 如果关键模块位于调用模块的底部, 则从上至下测试方法更优。
从下至上测试的主要缺点是系统的早期版本直到最后模块测试完毕才产生, 并且设计和测试一个系统不能重叠进行, 因为不可在低级模块设计之前进行测试。S
摘要:软件测试是软件质量的重要保证, 对软件测试的目的、原则、标准做了简介, 同时介绍了几种常用的软件测试方法。
关键词:软件测试,需求分析,软件质量
参考文献
[1][美]Jeffrey Richter.Windows95Windows NT3.5高级编程技术[M].郑全战, 阿夏, 译.清华大学出版社, 1998年2月.
[2]郑人杰, 殷人昆, 陶永雷.实用软件工程[M].2版.清华大学出版社, 1997年4月.
[3][美]Allen G.Taylor.SQL使用指南[M].吴言, 李东, 等, 译.电子工业出版社, 1999年3月.
[4][美]James R.Groff&Paul N.Weinberg.关系数据库SQL使用指南[M].付增少, 彭振云, 等, 译.学苑出版社, 1999年10月.
[5]William Perry.Effective Methods for Software Testing[M].1998by John Wiley&Sons, Inc.
[6]Boris Beizer.Software Testing Techniques (Second Edition) [M].1999by International Thomson Computer Press.
[7]Brian Marick.The Craft of Software Testing—Subsystem Testing Including Object-based and Object-oriented Testing.PTR Prentice Hall, Englewood Cliffs, New Jersey07632.
[8]Richard E.Fairley.Tutorial:Static Analysis and Dynamic Testing of Computer Software.1978IEEE, Computer.
[9]Thomas Jaudon Ball.The Use of Control-flow and Control Dependence In Software Tools.1993University of Wisconsin Madison.
[10]W.E.Howden.An Evalution of Effectiveness of Symbolic Testing and of Testing on Actual Data.Software Practice and Experience.
软件测试概述 篇2
PRO/E 4.0软件操作简介
项目要点:
1、PRO/E野火4.0软件的启动
2、PRO/E野火4.0软件的界面组成
3、PRO/E野火4.0软件的基本操作
4、垫片与垫圈零件的创建
掌握PRO/E软件的安装、熟悉PRO/E工作界面.掌握文件的基本操作
1、掌握PRO/E软件的安装
能力目标
2、掌握进入,退出pro/E
3、创建工作目录.4、基本绘图命令的使用.5、文件的保存.知识目标: 素质目标
一、PRO/E野火4.0软件的启动
PRO/E野火4.0软件安装完成之后,单击Windows[开始]菜单中的[程序],依次执行[PTC]→[Pro ENGINEER] →[Pro ENGINEER]命令,即可打开Pro/ENGINEER系统。如果在安装时选择了在桌面创建快捷方式,可以通过双击桌面上的图标(快捷方式)直接启动。
二、PRO/E野火4.0软件的界面组成
图0-1 proe野火4.0基本界面
三、PRO/E野火4.0软件的基本操作
1、设置工作目录
单击“文件”→“设置工作目录”,选取工作目录,指定合适的文件夹。
2、文件操作
德州科技职业学院教案
2.1 新建文件
2.1.1“文件”→“新建”,系统将弹出“新建”对话框,如图0-2所示,在“类型”选项下选择“零件”,在“子类型”选项下选择“实体”。
2.1.2 在“名称”文本框内输入文件名,文件名不可以包含任何中文字符和标点;如果不输入文件名,则按系统默认的文件名命名。
2.1.3 选中“使用缺省模板”复选框,在新建PROE文件时,系统默认的是英制单位,如果用户要选用公制单位,可取消“使用缺省模板”复选框的选择,然后单击“新建”对话框中的“确定”按钮,此时系统弹出“新文件选项”对话框,如图0-3所示,选取mmns_part_solid(mmns是mm.Newton.second的公制单位缩写),再单击“确定”按钮。2.1.4 单击“新建”对话框中的“确定”按钮,完成新建文件的操作。
图0-2 “新建”对话框 图0-3 “新文件选项”对话框 2.2 保存文件
在菜单栏中选择“文件”→“保存”命令,系统将弹出“保存对象”对话框,如图0-4所示。在保存对象的过程中不能够修改文件名称。保存后的文件的格式为“文件名.扩展名.版本号”。
德州科技职业学院教案
图0-4 “保存对象”对话框
2.3 拭除文件
每次保存文件时,系统均会自动创建一个新版本的文件,并将其写入磁盘中。PROE为存储文件的每一个版本进行连续编号。当拭除文件时,将删除保存在内存中的文件,但不删除保存在磁盘中的文件。
选择“文件”→“拭除”命令,此时有“当前”、“不显示”和“元件表示”3种选择,如图0-5所示。“当前”表示从进程中移除活动窗口中的对象;“不显示”表示从进程中移除所有不在窗口中的对象;“元件表示”表示从进程中移除未使用的简化表示。
图0-5 “拭除”选项示意图
2.4 删除文件
为了节省磁盘空间,用户可以将不必要的文件从磁盘上删除。每次保存文件是,会在内存中创建该文件的新版本,并将上一版本写入磁盘中。PROE为存储文件的每一个版本进行连续 编号。当删除文件时,可将文件从磁盘中删除,并移除旧的不必要的版本。
选择“文件”→“删除”命令,此时有“旧版本”和“所有版本”两种选择,如图0-6所示。“旧版本”是指删除指定对象除最高版本以外的所有版本;“所有版本”是指从磁盘删除指定对象的所有版本。
图0-6 “删除”选项示意图
2.5 鼠标的使用
2.5.1 在任何状态下
CTRL+鼠标中键(上下移动)或直接滚动鼠标中键:缩放模型。 鼠标中键:按住鼠标中键不动,移动鼠标将可以旋转模型。 SHIFT+鼠标中键:平移模型。2.5.2 在草绘二维图模式下
在绘制二维草绘图时,鼠标的功能如下:
鼠标左键:选择特征、曲面、线段等图元;
鼠标中键:接受选择的图元,相当于菜单管理器中的“完成”按钮。2.5.3 鼠标使用技巧
在PROE中,使用鼠标有以下几点技巧。
用鼠标左键在屏幕上选择点,用鼠标中键中止当前操作。 草绘时,可以通过单击鼠标右键来禁用当前约束(显示为红色),并可以按住SHIFT键并单击鼠标右键来锁定约束。
四、垫片零件的创建
1、以公制模板新建文件:dianpian.prt。
德州科技职业学院教案
启动Pro/E软件程序,单击文件中的“新建”,如图0-7所示:
图0-7 “新建垫片”对话框
单击确定即可。弹出“新文件选项”,如图0-8所示。
图0-8 “垫片公制模板”选项
单击“确定”完成。
2、创建拉伸特征
2.1 以TOP面为草绘平面创建草绘特征如图0-9所示:
图0-9 “垫片”草绘特征
德州科技职业学院教案
2.2 单击“拉伸”特征,创建双侧拉伸特征,拉伸的深度值为2,如图0-10所示。
图0-10 双侧拉伸选项
最后单击,完成操作。如图0-11所示:
图0-11 垫片零件效果图
五、垫圈零件的创建
1、以公制模板新建文件:dianquan.prt。
启动Pro/E软件程序,单击文件中的“新建”,如图0-12所示:
图0-12 “新建垫圈”对话框 单击确定即可。弹出“新文件选项”,如图0-13所示。
德州科技职业学院教案
图0-13 “垫圈公制模板”选项
单击“确定”完成。
2、创建拉伸特征
2.1 以TOP面为草绘平面创建草绘特征如图0-14所示:
图0-14 “垫圈”草绘特征
2.2 单击“拉伸”特征,创建单侧拉伸特征,拉伸的深度值为3,如图0-15所示。
图0-15 单侧拉伸选项
最后单击,完成操作。如图0-16所示:
计算机软件动态演化技术概述 篇3
关键词:动态演化;语言层面;体系结构模型
中图分类号:TP311.52
1 软件动态演化的定义
计算机软件技术的发展,令人们的社会生活变得丰富有趣,然而随着计算机硬件技术和网络技术的快速发展,各种各样的计算硬件平台充斥到计算机网络应用的方方面面,许多软件已经因为不能适应物理环境的改变失去了生存空间,人们期望能够有一种新的软件技术来代替原有的软件开发技术,使得开发出的软件能够适应物理环境的改变,延长软件的生命周期,降低软件的开发成本。针对这个问题,国内外专家学者都提出了自己的解决方案,如网构软件、自治计算和普适计算机模式等。
透过现象看本质,产生这个问题的原因是变化,网络环境的改变,硬件环境的改变和人们对软件功能的需求改变。为了解决这个问题,软件动态演化技术应运而生。软件动态演化技术就是期待所开发出来的软件能够在运行中,根据环境地变化而主动修改执行以呈现不同的功能行为的技术。演化主要由满足设计期间需求的预设演化和满足运行期间需求的非预设演化构成。目前,软件动态演化已经成为软件工程中一个新的但是很热门的研究领域。
2 软件动态演化的意义
传统软件常常期望能够尽可能多的满足用户的需求,也就是传统软件演化主要是预设演化,但由于用户需求、网络环境介质,拓扑结构,计算平台等软件应用环境的改变以及软件开发周期的限制,要在软件开发的设计初期考虑所有潜在和未知的需求几乎是不可能的。因此为了延长软件的生存周期,使有限的资源发挥最大的功效,提升软件的适应能力,软件需要具有动态演化的能力。另外,互联网经济体已经成为世界上最重要的经济体之一,互联网经济体对软件的需求是不间断运行,这也是互联网经济体的特点之一,在这种情况下,那怕是因为正常的软件升级和优化造成的短暂停止都会带来巨大的损失,这是用户所不能忍受的。所以支持动态演化是软件维护过程中的有力保证。再者,现有的软件提供模式已经不再能满足用户的需求,用户不希望同一个软件对于不同的用户呈现出来的都是千篇一律的应用,不同的用户对于同一个软件的不同功能感兴趣,用户更希望能够根据需要定制所需软件,因此,这也要求软件具有演化功能。软件演化技术正是在需求个性化与多元化的刺激下应运而生的。
3 软件动态演化技术的研究现状
现有的软件动态演化技术从软件描述语言、软件体系结构及软件框架与模型等方面进行了深入研究。
(1)在软件演化编程技术上,各种编程语言都提供了一些有效机制实现软件的动态演化,在JAVA和C++语言中提供了延迟绑定机制,使软件在运行时才绑定具体的对象。C#中的反射机制,可以对软件进行内省,并可以在运行时动态创建对象。但是,编程语言提供的自适应演化机制仅仅局限于DLL替换、函数等小规模范围的演化。
(2)构造动态演化的软件系统难度非常大,原有的演化方式具有将动态演化逻辑固化在应用逻辑中的缺点,这样的方法具有很大的局限性。为了能够在宏观的角度指导软件系统在运行时刻的动态演化,现在的研究从体系结构的角度出发进行动态演化软件的设计,取得了较好的效果,这种支持软件动态演化的体系结构也被称之为动态软件体系结构。我国的北京大学提出了自适应软件体系结构建模及其实施的方法描述,浙江大学则给出了一种形式化的动态体系结构描述语言。
(3)在研究中,许多科研机构给出了软件动态演化技术的框架和模型。东南大学提出了一种自适应框架,该框架可以根据学生的访问设备、网络状况、用户信息等上下文信息动态生成学生的学习对象课件,并且在学生进行学习的过程中,对学生的行为和喜好进行信息收集,以帮助更新学生的模式库和数据挖掘规则。
浙江大学博士提出了一个面向普适计算的自适应中间件模型SCUD,在SCUD中通过扩展时序逻辑对中间件自适应语义进行规范范描述,利用基于内省与上下文感知的外省机制组成一个有机的整体,实现面向普适式计算的可靠高效的中间件自适应演化机制。
(4)作为软件设计开发的新思路,面向服务计算和面向服务体系结构可以通过重用有良好接口的服务而构筑一个新的软件系统,服务与服务之间连接使用松耦合,互相依赖较少。在软件演化技术的研究过程中,不管是采用体系结构还是利用反射等机制,技术核心都是软件实体之间的分离和对象的松耦合引用,只有软件实体之间尽可能的分离,那么单个的软件实体的变化才不会影响其它实体的行为,而松耦合的对象引用让系统在运行过程中,可以通过代理的解释,透明的转换到实际的对象,这样当对象重建、变化、修改时,用户察觉不到的,系统在运行时的状态便灵活可变,也就实现了用户变化需求的目的。在面向服务的软件体系结构中,将业务逻辑和具体实现技术两者进行了分离,从而使遵循该体系结构的软件应用能适应逻辑业务与实现技术的不断变化;另外,服务提供者将服务的接口信息向服务注册机构发布,该接口信息描述了服务所需的外部环境以及它向外部提供的服务;而服务调用者则通过服务代理查找服务注册登记处,查找自己所需的服务,进而使用服务接口。这样就实现了服务在运行时进行重新组合,可以随时申请的注销服务。前面所述的机制保证了面向服务体系结构的软件系统在运行时可以灵活多变,实现响应用户需求变化的目的。
4 软件动态演化技术的应用前景
目前,软件动态演化技术的相关理论、技术和方法仍然处在起步阶段,到大范围的应用阶段仍存在一定的距离,许多方法理论需要进一步的研究完善。但是,由于互联网技术和计算机硬件技术的发展,人们对具有动态演化能力的软件需求必将进一步扩大。具有动态演化功能的软件将成为人们开发软件时的首选,具有动态演化的系统可以通过收集外部信息进行自我评估,当信息变化表明外部环境发生变化时,可以进行软件形态的变化,主要表现为软件实体数目、结构和软件具体行为的变化。这样,通过软件演化技术产生的系统将能更加广泛的应用于各种不同的计算平台,使得软件的通用性及个性得到最大限度的发挥。
5 小结
软件动态演化技术的研究和应用软件开发有重要意义,在增强软件对环境的适应能力方面有着广泛的应用前景。本文简单的阐述了当前软件动态演化技术的现状及应用前景。介绍了当前软件动态深化技术取得的一些成果和技术。为以后进一步的研究打下了坚实的理论基础。在以后的系统开发过程中,应该将重构思想贯穿全局,重构的工作方式可以大大减少先前设计的工作量,同时它使设计变为一种必要和需求的产物。这种产物能更准确地反映问题的本身。同时,它也可以使设计随着对问题的进一步深入而逐渐变得合理。这是一种进化的设计方法。
参考文献:
[1]张国辉,谢小鹏,陈建明.一种软件重构设计方法及其应用[J].现代制造工程,2010(05).
[2]王颖斯,刘建宾.软件重构技术综述[J].福建电脑,2009(10).
[3]殷定媛,高建华.软件重构中Visitor设计模式和应用[J].计算机工程与设计,2006(24).
[4]陈生庆,张立臣,陈广明.面向方面软件重构等价性形式化证明方法[J].计算机科学,2006(07).
[5]林治.软件重构在软件开发中的作用分析[J].扬州教育学院学报,2007(03).
计算机软件测试方法概述 篇4
软件测试是一个破坏性、重复性的过程, 其目的是以尽量少的时间和资源尽早的找出软件中潜在的错误和缺陷。通过分析错误和缺陷产生的原因及分布特征, 可以帮助项目管理人员发现软件开发过程的不足, 以便过程改进。同时, 也有利于设计出高效的、有针对性的测试用例。
1 测试的主要方法
1.1 黑盒测试和白盒测试
依据是否了解程序代码内部实现方式, 测试方法可分为黑盒测试和白盒测试。黑盒测试是把程序看作一个不能打开的黑盒子, 在完全不考虑程序内部结构和内部特性的情况下, 在程序接口进行测试, 它只检查程序功能是否按照需求规格说明书的规定正常工作, 程序是否能正确接收输入数据而产生正确的输出信息。主要针对软件界面和软件功能进行测试。在实际操作中, 测试人员既需要测试正确的输入信号, 还需要测试不正确的输入信号, 以测试软件对错误的处理能力。当输入错误信号时, 软件系统应友好的提示用户, 而不能出现系统崩溃、用户数据丢失等现象。
白盒测试是按照程序内部的结构测试程序, 检测程序内部动作是否按照设计规格说明书的规定正常进行, 检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子, 测试人员依据程序内部逻辑结构相关信息, 设计或选择测试用例, 对程序逻辑路径进行测试, 通过在不同点检查程序的状态, 确定实际的状态是否与预期的状态一致。
1.2 错误驱动测试
通过性的功能测试仅能测试系统已实现的功能的正确性, 而对系统容错能力却无法测试。在用户实际使用的过程中, 会有大量的不正确的输入, 此时系统能否对不正确的输入进行容错处理?基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例进行测试就是错误驱动测试。
1.3 回归测试
软件测试是一个发现错误和改正错误不断循环的过程。由于程序的复杂性, 各个模块及元素 (变量、函数、类) 之间存在着相互关联性、耦合性, 因此对于改正后的错误, 需要测试验证。一方面验证错误是否已被修改, 另一方面检查对错误的修改是否影响其它模块产生新的错误, 这就需要将已执行过的测试用例重新执行, 这就是回归测试。
2 软件测试的流程
2.1 单元测试
单元测试是软件开发过程中对程序最小可测单元进行的测试活动。其目的在于根据详细设计说明书, 从程序的内部结构出发, 检查每个程序单元是否正确实现详细设计说明书中的模块功能、性能、接口和设计约束等要求。
单元测试是在程序单元的代码编写完成, 确认没有语法错误之后由程序员进行, 根据详细设计说明书和源程序清单, 对该模块的逻辑结构, 程序内部分支路径进行测试, 来发现和修改代码编写过程中的错误。主要采用白盒测试和黑盒测试相结合的方式进行测试, 使之对任何合理的和不合理的输入, 都能鉴别和响应。单元测试的主要内容包括接口测试、功能测试、局部数据结构、覆盖条件、执行路径测试、出错处理、边界测试等。
2.2 集成测试
集成测试在单元测试的基础上, 将两个或多个模块按照概要设计说明书的要求有序的、递增的组装成子系统, 对这个子系统进行测试。集成测试, 着眼于测试当各个模块连接起来的时侯, 穿越模块接口的数据是否会丢失, 一个模块的功能是否会对另一个模块的功能产生不利的影响, 各个子功能组合起来, 能否达到预期要求的父功能, 全局数据结构是否有问题, 单个模块的误差累积起来, 是否会放大, 从而达到不能接受的程度。集成测试多采用增量式组装测试, 增量式测试是一种可行性比较高的方法。增量式测试又分为自底向上和自顶向下两种测试方式。
自顶向下测试从程序的顶点模块开始, 然后逐步组装下一级的模块进行测试。为了模拟被测试模块的下一级模块, 需要构建哑模块或桩子模块。它从主控模块开始, 按照软件的控制层次结构, 以广度优先或者深度优先的策略, 把各个单元模块组装集成在一起。自顶向下测试的主要好处就是较早地验证了主要控制点和判断点, 按深度优先可以首先实现和验证一个完整的软件功能, 功能能够较早获得证实, 带来信心, 只需一个驱动, 减少驱动器开发的成本, 支持故障隔离, 它可以让人们看见系统的早期版本并证明系统的正确性。主要缺点是需要桩子模块, 底层验证被推迟, 底层组件测试不充分。
自底向上测试策略从程序的最底层模块开始。为了模拟上一层的模块需要开发一定的驱动模块。当对所有的低一层模块测试完毕才对高一层模块组合进行测试。自底向上测试方法的优点是测试数据的建立不存在困难, 对底层组件行为较早验证, 工作最初可以并行集成, 比自顶向下效率高, 减少了桩的工作量, 支持故障隔离。驱动模块模拟所有的调用参数, 如果关键模块位于调用模块的底部, 则自底向上测试方法更优。自底向上测试的主要缺点是系统的早期版本直到最后模块测试完毕才产生, 驱动的开发工作量大, 对高层模块的验证被推迟, 设计上的错误不能被及时发现, 因为不可在底层模块设计之前进行测试。
当各单元被分别测试后, 集成测试根据设计阶段形成的功能分解树, 自顶向下或自底向上逐步用各个单元来替换桩和驱动程序。集成测试一般在完成了软件的所有或大部分编码, 并且完成单元测试工作后, 由各单元模块开发人员一起完成。一般采用白盒测试与黑盒测试相结合的方法。
2.3 系统测试
系统测试是将软件系统与计算机硬件、外设、其它系统软件、数据和人员等其它系统元素结合在一起, 依据需求规格说明书, 发现软件不符合需求规格说明书的地方。系统测试的测试用例是根据需求规格说明书来设计, 并模拟用户使用环境来执行。系统测试的内容极其广泛, 包括功能测试、容错性测试、性能测试、压力测试、协议测试、安全性测试、兼容性测试、稳定性测试等等。通常采用黑盒测试。
2.4 验收测试
验收测试是按照项目任务书或合同、供需双方约定的验收依据文档进行的对整个系统的测试与评审, 决定是否接收或拒收系统。验收测试是为了向用户证明软件已经实现需求规格说明书所定义的功能和要求, 软件能正确的、安全的、按照预定要求的为用户服务。测试重点主要是软件是否实现用户需求, 而不是针对功能进行的测试。所以验收测试不需要专业的测试技术, 也可以是使用该产品的最终用户来体验该软件是否能够满足使用要求, 也可以由开发团队和用户方以外的第三方按照用户需求规格说明书来跟踪和测试软件是否能实现需求。
3 软件测试的展望
随着国家信息化和软件行业的发展, 软件系统的规模越来越大, 国内外的软件开发企业和软件用户越来越重视软件质量, 软件企业已经建立了独立的软件测试和质量保证部门, 并配置了专职的测试和质量保证人员, 并且在软件行业中已经出现了独立的第三方软件评测机构, 软件测试作为一个独立的专业和行业正逐步走向成熟。在今后的软件系统开发中, 软件测试工作将不再局限于单元测试、集成测试、系统测试和验收测试, 而会将测试工作进一步前移, 对需求的精确性和完整性的测试技术, 对系统设计的测试技术将成为新的研究热点。
参考文献
[1]陈明.软件测试技术[M].北京:清华大学出版社, 2011.
[2]朱寅非.软件测试在软件开发过程中的应用探析[J].无线互联科技, 2013 (5) .
软件架构师岗位的工作职责概述 篇5
1. 理解产品及体验的业务需求,设计后台实现方案。
2. 负责或参与微服务架构设计、技术调研和方案制定。
3. 制订并遵守代码规范,参与新技术调研与引进。
4. 负责或参与公司框架核心代码开发。
5. 带领并指导团队成员。
任职要求:
1.4年以上JAVA开发经验,2年以上微服务实战工作经验。
2.熟悉微服务相关概念、有构建微服务化应用程序的项目经验。
3.熟练掌握Spring boot、REST API。
4.熟练掌握Mysql、Redis/Mongodb/ElasticSearch数据的设计、研发、优化和部署
5.对各种开源的框架、中间件如RabbitMq、Kafka,Spark等有深入的了解。
6、具有大规模分布式系统的调优经验(如JVM调优、SQL调优、缓存优化、RPC优化等);
7、熟悉Kubernetes、Docker容器基础之上开发微服务。
软件水印及其研究现状概述 篇6
计算机技术的日渐成熟,特别是信息时代的到来,为信息的传播提供了便利,特别是对数字产品的传播,人们通过网络这个媒介对其进行无限制的复制与分发。而软件作为一种典型的数字产品,面临日渐增长的盗版问题,这种现象造成软件开发商不可忽视的经济损失,已然成为软件业发展过程中的一大安全隐患。
在软件水印出现之前,一般都采用加密的手段对软件实施保护,其算法的加密强度也就决定了保护软件安全的力度。在一定程度上,加密技术解决了一些保护软件版权方面的问题,但由于加解密算法存在一定的局限性,攻击者一旦成功解密了加密算法,此时加密算法就失去了保密性,保护软件的功能也就失效,软件水印应运而生。
软件水印属于软件保护领域中的一类,也是信息隐藏技术的分支。它主要为软件提供版权证明的功能,一旦发生盗版可以追查盗版源,克服了传统加解密技术攻破后不能为软件提供进一步保护的缺陷。目前,国内外涌现出许多关于软件水印算法的论文,相关单位也申请了多项关于软件水印方面的专利[1-4]。文献[5]对基于图理论的软件水印技术、矢量提取软件水印技术、基于寄存器分配的软件水印技术进行了深入的分析和综述,近年来,软件水印的研究方向又有了新的发展,在其广度和深度上又有了进一步的突破。
本文从软件水印的概念出发,介绍了其模型和主要的攻击方法,重点介绍了现有主流算法的思想,并讨论了这些算法的利弊,提出了软件水印下一步的工作重点。
1 软件水印相关知识
1.1 概念
软件水印是一种特殊的数字水印,把代表了软件所有者和用户身份等信息嵌入到软件产品中以达到保护软件版权的目的。其中,嵌入的水印信息必须能够清晰直观地表达软件版权所有者的拥有权,纵观已有的水印算法,其嵌入的信息有选择软件开发机构的名称、软件序列号和许可证代码等,另外也有将两个大质数的乘积作为水印信息w的算法,其原理是利用两个大质数难分解的问题来表明对版权的拥有[6]。
1.2 模型
软件水印基本模型如图1所示,主要包括三个部分,水印的预处理、嵌入和提取。其中预处理部分是将代表软件版权和标识有用户身份等方面的水印信息w通过一定的加密算法进行处理,提高水印信息的安全性。嵌入部分是给定待保护的软件P,同时为了提高系统的安全性能,引入密钥,在key的协助下,将预处理后的信息w通过特定的算法嵌入到P中,形成标识有特殊水印的目标软件P'。而提取部分是嵌入部分的逆过程,且只有在持有正确密钥key的前提下,才能用对应的提取算法从受保护的P'中提取出水印w',经过反预处理得到解密后的水印信息。在有版权纠纷的情况下,将w和w'进行比较,从而达到证明版权的目的。
1.3 攻击
水印的嵌入量、抗攻击性和隐蔽性决定了软件水印算法的安全性能,其中,嵌入量是指水印包含信息量的大小,隐蔽性是嵌入水印后软件的变化程度,而抗攻击性即鲁棒性,顾名思义表示水印算法抗攻击的能力。所以评价一个水印算法的好坏进而对其进行改进,必须知道水印可能遇到的攻击类型,总体上,对软件水印的攻击主要有以下4类[5,7]:
(1)追加攻击攻击者往载体软件中加入其他水印,版权所有者在提取水印验证版权时,由于攻击者添加了新的水印,前后两者的差异性,将引起版权纠纷,使原有的水印达不到版权证明的作用。
(2)删除攻击此种类型的攻击,攻击者首先需要定位出水印确切的嵌入位置,然后在不影响载体软件功能实现的前提下,将水印信息从载体软件中删除。
(3)扭曲攻击此类攻击是在保持软件可用性的前提下,攻击者根据水印嵌入的方式,对嵌入水印的载体程序进行语义保持变换[7],使软件版权所有者不能正确地提取出水印,或者提取出的水印也不再具有版权证明的作用。
(4)逆向工程攻击者可以通过反汇编或者反编译器分析出载体软件嵌入水印的算法和关键的数据结构,在不引起软件功能明显改变的前提下实施进一步的攻击。
对于任何软件水印算法,评价其安全性能的三个性能指标密切相关,并且相互制约。如嵌入的水印信息量过大,则在载体软件中表现的隐蔽性将会明显减弱,相应地,水印的鲁棒性能也会有所减少,所以在实际的应用中,是取三者的折中。
2 现有软件水印算法
按照嵌入和提取水印方式的不同,软件水印大体划分为两类:静态软件水印[8,9,10,11,12,13,14]和动态软件水印[15,16,17,18,19,20,21,22,23],其中,静态软件水印实现方法较简单,且在提取时不用运行程序,容易识别,但存在鲁棒性低的问题。而动态软件水印是在特定输入下,根据程序某个时刻运行的状态进行信息的编码,这种状态可以是指令的执行顺序或内存地址的走向[15,17]。动态软件水印的鲁棒性虽高,但通用性却不强,只能用于完整的可执行程序,不能应用于单独模块,也无法抵御多重攻击组合的复合攻击。
现有的比较典型的软件水印算法如下:
2.1 基于动态图的软件水印
典型的动态软件水印代表是动态图软件水印,其概念最早由Collberg和Thomborson提出[22],它将水印信息蕴含在某种特定的拓扑结构中,在程序运行时动态地生成水印。由于这种特殊的数据结构包含许多指针,而指针的具体值在每次运行时都是不同的,所以,相对于通常的水印,给攻击者带来的攻击难度更大,鲁棒性能也就更好。该类算法的优势,首先难以通过别名分析定位水印,其次容易实现防篡改部分。
图2所示的PPCT是一种特殊的二叉树结构,首先为这个二叉树添加了一个生成节点,其右指针直接指向根节点,然后为每个叶子节点添加了左右两个指针,其中右指针指向本身,左指针均指向最靠近自己左边的叶节点,最左边的叶节点直接指向了生成节点,而生成节点的左指针指向最右侧的叶节点,经过添加指针后,其检错性强,鲁棒性能高,能很好地蕴含水印信息,但所能表示的数据率低,而基数K链表结构嵌入量大,但结构过于简单,自我纠正能力差。目前此类的软件水印研究根据不同目的对结构进行改进提出新算法,典型算法如下所述。
文献[16]针对PPCT编码效率低的特点,将PPCT枚举编码的抗攻击能力和基数K枚举编码的编码效率融合。弥补了PPCT编码效率低及基数K编码图抗攻击能力弱的不足,但另一方面,混合编码图的扭曲攻击和容错性能较PPCT,其鲁棒性性能相对减弱。
文献[18]在动态图PPCT基础上,提出了两种改进的动态图水印拓扑结构。经过修改后的结构相比于基数K、PPCT有更高的性能。该算法结合基数K结构编码的高数据率,PPCT、IPPCT高的防篡改能力和鲁棒性的特点,提出PIPPCT和MIP-PCT拓扑结构,具有更高的数据率和鲁棒性。但将此算法应用到实践中存在很多问题,例如,此结构高性能的体现必须满足一定的条件范围,而这个条件范围的确定是在综合考虑水印的嵌入量、隐蔽性和鲁棒性的因素后确定的。另一方面,为了增强结构的防篡改能力,还需要在这个多维的结构中选取一部分结构进行防篡改编码。可见,研究者将花费大量时间确定水印结构。
用PPCT表示一个大数时,其结构是很庞大的。文献[20]针对这点对基于拓扑结构的算法进行了改进。首先在预处理阶段将表示水印信息的大数分解成若干个子数据,然后再用PPCT分别编码这些子数据,再嵌入到程序中,同时为了防止攻击者恶意篡改水印信息,在嵌入的过程中,又加入了防篡改机制,提供了更高的安全性。由于该算法不是将水印直接嵌入到待保护的程序中,而是结合加密技术将水印进行了分解,大大提高了水印信息量,同时嵌入部分的多样化,同时提高了水印的鲁棒性。
文献[14]提出一种基于代码加密的防篡改软件水印方案。它是对隐藏水印信息的PPCT结构进行了改进,在水印嵌入的过程中,对代表版权信息的大数进行预处理分割,以提高水印信息的隐蔽性,然后通过修改软件的源代码和目标代码实现水印的嵌入过程,并对部分目标代码进行加密,以提高加解密密钥与程序自身的关联聚合度,从而增强软件水印的鲁棒性以及防篡改能力。
2.2 基于PE文件的软件水印
PE文件是微软win32的原生文件格式,每一个win32可执行文件都遵循PE文件格式,其结构如图3所示,微软操作系统的广泛使用使基于此种格式的软件水印研究成为必要。目前,基于PE文件格式的软件水印大体上分为两类,第一种是利用PE文件的冗余空间,这种冗余主要来自两方面,一是PE文件额外构造的节,二是PE文件自身结构的特殊性存在的冗余部分,如节与节之间的冗余,某些结构中空闲的字段等;第二种是根据PE文件的资源段、引入表、重定位表等结构的特殊性进行水印的嵌入。典型算法如下所述。
文献[24]提出了零水印的观点。是指在原程序的基础上不添加额外的代码嵌入水印。此类思想不仅保证了数字产品的完整度,同时抗攻击性也比较突出。通过分析PE文件的代码段后,把其分成若干部分,根据水印信息混淆这些代码,借鉴混淆思想,改变代码段中两条跳转指令之间的跳转高度来嵌入水印信息,其优点是能有效阻止变形攻击,同时代码混淆思想的引入,增加了逆向分析的难度,增强了软件水印的鲁棒性,但前提是要先分析出源代码中的代码段后,才根据水印信息混淆代码段,增加了算法实现的难度。
文献[10]提出一种基于指令编码的软件水印方案。该方案先对源代码进行分析,找出可替换指令,然后根据一定的规则进行编码,通过对这些指令进行替换实现水印的嵌入,提取过程则是嵌入水印方法的逆过程,读取出进行替换了的可编码指令,再根据编码规则实行解密,该算法实现简单,但同时也容易受到篡改攻击。
熟悉PE结构知各节与节之间,节的字段间均存在空闲的空间。文献[25]利用这一特性提出一种静态软件水印算法。它是将水印信息经过一定的预处理算法后,将其隐藏于这些空闲空间和字段中,为了增强算法的安全性,同时将PE文件的相关关键字段进行调整和修改。
文献[26]首次将反逆向工程技术和混沌系统的思想引入到软件水印中,同时还申请了相关专利[1]。该算法主要有三大模块:监控输入模块、反逆向工程模块、水印解码模块,其中用户输入监控模块用于监控用户的输入情况,而反逆向工程模块用以抵抗攻击者的逆向分析,最后是水印的解码模块,由于嵌入的水印是通过混沌的思想进行了预处理,同时利用混沌系统将信息分布到PE代码段的各个部分,所以需要相应地提取模块进行水印的提取和恢复。总体上,该系统具有较好的抵抗性,鲁棒性较高,但是由于引入了三大模块,且均要分布到PE中,使原始的PE文件大小增大,同时其空间和时间复杂度相对变复杂。
文献[6,13]将水印信息隐藏于PE重排的引入表和资源段之中。与将水印嵌入在PE冗余空间和冗余字段的算法相比,此类算法由于利用了PE文件自身结构的特殊性,使嵌入的水印具有更强的隐蔽性。但在对PE文件的结构布局有一定了解的前提下,如果用相关分析工具分析资源段和引入表中的数据,能察觉出两个段中数据的重新调整,易遭受篡改攻击。
文献[27,28]对PE文件资源段的图标和位图数据进行分析,利用其在系统中的显示特征和存在的冗余字段进行信息的嵌入,该算法隐蔽性较高,但是其应用范围存在局限性,水印的嵌入必须是在该PE文件存在足够的图标和位图资源的前提下才能进行,如果不满足此前提条件,该算法是不适用的。
2.3 基于线程关系的软件水印
由于线程存在高安全性、易控制的特点,基于线程关系的软件水印近年来也有不少研究成果,相关单位也申请了有关这方面的专利[4]。基于线程关系的软件水印算法由Jasvir Nagra和Clark Thomborson[29]首次提出,该类算法利用同步的思想使程序中的线程按照一定的顺序执行,将水印嵌入多线程的并发执行轨迹中。该算法表现出较好的隐蔽性和抗攻击能力,对程序大小和运行时间的影响也保持在一个可以容忍的范围内。但为了保证算法可以提供足够的水印嵌入量,需要引入大量的冗余线程,同时需要保持这些线程的顺序执行,导致程序运行效率底下。
文献[21]针对存在的缺陷提出一种新的基于线程关系的软件水印算法。其基本思想是通过修改源程序来控制运行中产生的线程关系,将软件水印嵌入在程序运行时生成的线程关系矩阵中。它充分利用程序中已有的线程,通过监控程序执行,生成线程关系矩阵(其中只需考虑两个线程之间的关系),达到嵌入水印信息的目的,较之已有的基于线程关系的软件水印算法,该算法不需要添加额外的冗余线程,从而大大提高了程序的运行效率。同时对各种针对线程的攻击有着较好的抵抗能力,实现也更为简洁,对原程序的影响较小,并有着更高的嵌入效率,且不只局限于基于线程的基础上嵌入水印,在基于程序中的窗口、代码等元素也是可以嵌入信息的。该算法仍有一些地方可以改进,如水印的嵌入位置,以及在线程关系矩阵中的映射关系都可以以一种更有效的方法给出,这将是今后一段时间的工作方向。同时由于本文提出的算法在嵌入时需要拥有程序的源代码,研究者将花费更多的时间在理解代码上,增加了软件成本的开销问题。
2.4 基于方程式序数的软件水印
该类软件水印算法是以源代码为载体实现水印信息的嵌入,其中文献[11]将水印信息隐藏于源代码中重新排列的表达式中。方程式普遍存在于程序中,其中改变算术运算的操作数的顺序,方程式的结果仍不发生变化,所以一个方程式可以同时写成不同形式,却具有相同的功能。该算法就是利用这个特性,重新排列方程式的操作数,用其重新排列的次序代表水印。该算法在源程序中并未添加任何额外的程序,但由于水印信息是隐藏于表达式中,信息量将过分依赖于表达式的数量,存在隐藏信息量受限的缺陷。同时如果方程式过多的话,则会花额外的时间来计算表达式的值,虽然这个时间几乎可以忽略,但是在某种程度上影响了程序的运行速度。
文献[9]针对方程式重排序等算法存在的问题,提出基于方程式逆序数的软件水印算法。同样也是以源代码为载体实现水印的嵌入和提取。其思想大致与基于方程式序数类似,同时引入了逆序数的概念,逆序数其实对应于方程式中系数的一种排列方式,由二进制数构成且组成一一对应的映射字典,它将这种映射后的关系隐藏水印信息。该类算法是一种盲水印,在没有原始代码的前提下即可提取出原始的水印信息,同时无须向程序中添加任何代码,便能隐藏大量的水印数据,该方法还可以推广到其他一些可以并行运行的程序指令中。但是该算法的隐藏水印的数据量同样也依赖于源程序中方程式的数量和方程式中系数的个数,同时也难以抵抗扭曲攻击。
2.5 扩频软件水印
此类算法的思想来源于多媒体扩频数字水印技术,它是将软件作为统计模型,将水印信息嵌入在软件特征矢量的各个分量中,而水印的检测则先提取嵌入水印后软件的新矢量与原始矢量,通过计算其相关性来决定。Stern首次提出基于指令统计矢量的扩频软件水印方案[30],文献[5,7]对此有了很详尽的描述,近年来,又有了新的发展。
其中,扩频软件水印的嵌入模型如图4所示,此类算法主要以二进制代码和Java字节码为载体。
文献[31]提出一种具有纠错编码特性的水印算法,该算法是将纠错编码的概念与改变指令统计特征方式相结合,通过替换等价指令改变程序相关指令的出现次数,即改变程序的指令统计特征,利用特征与水印信息的映射关系嵌入水印信息。该算法具有很强的鲁棒性和抗攻击性,由于在编码水印的时候运用了纠错编码,即需要校验位检测是否发生篡改,这使得用来编码水印的信息为减少,所表示的数据率也会相应减少,所以如何在保证软件水印鲁棒性的同时进一步提高嵌入的信息量是下一步研究的方向。
文献[12]根据函数调用过程中堆栈保持平衡的原理提出了基于栈分配的软件水印算法。该算法是将多媒体扩频水印的思想运用到堆栈平衡的原理中,其中它将函数中栈分配的大小作为特征矢量,然后根据要嵌入的水印来对栈的空间进行修改,其中栈访问混淆技术的运用增强了栈修改后程序之间的紧密性,使其能够有效抵抗追加攻击、删除攻击、扭曲攻击等,同时,在提取水印时又采用了栈访问过滤技术过滤攻击者对栈的恶意修改,具有更高的鲁棒和隐蔽性。但该方案只适用于各类编译好的产品。
3 几类软件水印算法比较和展望
表1总结了本文提及的几类水印算法,并讨论了每类算法可以改进的地方。
另一方面,现阶段软件水印主要处于理论研究的阶段,还鲜有运用到实际应用中,如何将理论结合到实践中,明确今后的发展方向至关重要。从表1可以得出,现阶段,研究者对软件水印的研究主要集中于单个水印算法,而单个水印的单调性,使其并不能很好地对软件进行全方面的版权保护,所以在今后的研究过程中,可以将多媒体技术中的“多水印”思想引入到软件中,使嵌入的水印具有更强的鲁棒性。文献[32]也首次提出了这个概念。
同时,通过大量的参考文献,发现现有的针对动态图软件水印的防篡改方案大都只是在感知篡改后,简单的让宿主程序不能使用,并没有考虑还能不能从遭到攻击后的宿主软件中恢复出嵌入的水印信息,而软件水印的最终目的是证明软件的版权所有,如何从遭到篡改的水印信息中恢复出水印信息是今后的研究重点。另一方面,针对载体是源代码的软件水印,由于开发软件产品的语言众多,如何设计适用于各种开发语言的算法也是今后研究工作的重点。
4 结语
软件水印为软件版权的保护提供了一条新的途径,是信息安全领域中的研究重点。本文综述了当前典型的水印算法,纵观这些算法,实现软件水印的方式主要分为两种:第一种方式,其水印的载体是源程序,水印信息是在软件的开发过程中就已经同步完成了嵌入;第二种方式,其水印的载体是中间码或者可执行文件,水印信息是在软件开发完成后再进行嵌入。统计现有的算法,发现目前绝大部分水印算法将重点放在了第一种方式的研究,在这种环境下,软件开发商在开发软件的过程中,将花费很大的精力来同步完成水印的嵌入,而软件开发商的最终目的是在花费更少的人力和物力的前提下,完成软件的开发,实现最大的利益。所以关于版权认证这块,完全可以在开发后期再进行实施,从这一方面来说,我们应该对第二种实现软件水印的方式引起足够重视。
英语阅读测试设计原则概述 篇7
很多人认为设计可靠有效的写作和口语试题比阅读试题难得多, 因为写作和口语试题主要依靠不可靠的主观评分, 而阅读测试主要依靠客观评分。实际上, 这种相对难度论是非常错误的。首先, 有时写作和口语考试的主观评分也是非常可信的。其次, 听和读这两种接受型技能通常不以明显的行为表现出来。人们写和说时, 我们能看到、听到整个过程;当他们读和听时, 我们往往缺乏观察的渠道。因此, 阅读试题应能成功地展示受试者的实际完成行为。要做到这一点绝非易事。阅读作为一种接受型技能是很难测试的。本文重点讨论阅读测试出题者在设计试题时应考虑的因素。
2 文本的选择
因为阅读是读者和文本之间的互动过程, 文本在阅读理解过程中起着关键的作用。Halliday (1979) 认为文本是语言的基本意义单位, 包含着很多潜在的意义, 需要读者在阅读过程中发现。Nuttall (1982) 指出文本是阅读过程的核心, 信息只有通过文本才能从作者传递到读者。测试阅读最重要的方面之一就是阅读文本的选择。文本会对阅读测试结果产生巨大影响。在选择文本时, 出题者应重点考虑以下几个方面:
(1) 多样化
应多使用几种文本类型。阅读测试的目的是提高测试者在实际生活当中的阅读能力。因此, 阅读文本应取自受试者将来可能读到的各种真实阅读材料。很多类型的阅读材料都可用作阅读测试文本, 包括杂志文章、报纸文章、学术刊物、书信、时间表、广告、指南、诗歌、路标等。这些类型也可以进一步细分, 如报纸报道、报纸广告、报纸社论等。不能仅仅为了图方便而重复地使用一种文本, 阅读文本应该能反映受试者的实际阅读需求。
(2) 文本类型
文本类型有助于读者的理解, 并提高阅读技巧和策略。选出的文本类型应反映语言教学目的。Weir (1993) 认为文本的选择应该适合观众的需要, 应该增加读者的动机, 而动机反过来对阅读速度和流利程度起重要的作用。比如, 如果学生学的是学术英语, 文本应该选自学术英语材料;如果学生学习英语仅是为了日常应用, 广告、对话或者书信这些文本更适合。
(3) 背景知识
设计阅读测试必须考虑的因素之一就是背景知识。阅读时, 如果我们了解该文本的背景知识, 我们能更容易更完整地理解这篇文本。假设中国大学生阅读两篇文本, 一篇是关于板球的, 另一篇是关于篮球的。因为大部分中国学生对板球知之甚少, 他们很可能理解不了文中关于板球运动的描述。因为篮球在中国很受欢迎, 他们很有可能很容易理解文中提到的关于篮球的信息, 甚至是那些文中没有直接提到的信息。因此, 应避免选择那些受试者非常熟悉或非常不熟悉的文本。如受试者对一篇文章的背景知识相当了解, 即便他们不理解该文章, 他们也有可能做出正确的回答。相反, 如受试者对阅读文本的背景知识一无所知, 即使他们的阅读能力强, 他们在理解文章作出推断时也会遇到相当大的困难。所以, 出题者应确保受试者对所选择的阅读文本的背景知识的了解水平相似。
(4) 难易程度
设计者需考虑文本的难易程度。文本既不能太难也不能太容易。阅读文本的难易程度应该大致跟受试者的水平一致。文本应能激起受试者的阅读兴趣, 又不会使他们兴奋过度或担忧。然而, 难易程度不是简单的问题。对于一篇难度很大的文本, 如果受试者对其背景知识相当了解, 他们也能够较容易地理解该文本。此外, 一份试卷中阅读文本的难易程度应该逐渐递增或者难易混搭。
(5) 文本长度
文本长度也应考虑。文本长度取决于受试者的平均阅读速度。文本长度应该适中, 并根据要测试的阅读技巧的不同作出相应的变化。比如, 要测试查读技巧, 文本的长度应该在2000字左右;要测试详细阅读能力, 几句话或许就够了。
3 测试的阅读技巧
阅读测试主要测试的是受试者的理解、分析、推断和区分能力。Heaton (1991:105-106) 大体上把阅读技巧分为三个层次:语法和词汇知识、微技能和宏观技能。
(1) 语法和词汇知识
语法和词汇知识主要指的是语法和词汇方面的基本概念。主要包括以下技能:1) 根据相应的图形符号识别出单词和词组。2) 理解句子内部的关系, 比如句子结构成分和复杂的嵌入结构等。3) 识别出带有将来时间副词的现在进行时的重要性。
(2) 微技能
微技能指的是执行复杂活动时用到的单个过程或能力。微技能也叫细分技能。阅读中的微技能指的是在词汇意义层面上的技能。微技能主要包括以下三个方面:
1) 通过理解构词法和语境提示推断单词的意义。
2) 通过识别话语暗示, 尤其是大意的介绍、发展、转变和结论, 来理解文本部分与部分之间的关系。
3) 识别出代词等的指示物。
(3) 宏观技能
宏观技能指的是直接跟需要或教学目标相关联的话语层面上的理解。宏观技能是所有三个层次里最高级的技能。阅读中的宏观技能主要包括以下几个方面:1) 理解明确的信息。2) 理解时间和空间关系及文章的脉络。3) 理解概念意义, 如质量和数量、比较和程度、原因、结果、目的、理由、状况、附加条件、对比、让步等。4) 预测文本中接下来会发生什么。5) 识别文本的大意和其他显著特征。6) 概括和得出结论。7) 通过推断 (如领会言外之意) 和理解比喻性语言 (如明喻和暗喻) 来理解文章中没有明确指出的信息。8) 略读和查读 (寻找大意和具体信息) 。9) 批判性阅读 (如评价写作风格) 。10) 根据阅读材料的类型和阅读目的采取灵活的方法并相应地改变阅读策略。11) 识别论据的发展阶段。
4 编写测试问题的步骤
一旦选择好了阅读文本, 接下来就是编写测试问题了。一般来说, 编写测试问题有以下五个步骤:
(1) 仔细阅读文本, 明确该文本适合的外语水平。及时记下读到的信息, 如主旨大意、有趣的信息点、论据的发展阶段、例子等。
(2) 明确测试的阅读技巧, 并根据相关阅读技巧决定编写适合的测试问题类型。
(3) 决定每个测试题的分值及分布。每个测试问题应该占有相同的分值。
(4) 编写测试问题。包括考试说明和问题的设计。如问题需要参考相应段落和行, 应给段落和行编号。
(5) 根据每项分值或其他要求检查分数分布是否合理。
5 关于中国目前阅读测试的建议
我国目前阅读测试的现状难以令人满意。最明显的就是大部分测试问题都是多项选择题, 无论是否适合该文本。很多大型考试, 如高考、学校期末考试等, 都经常出现这种现象。更糟糕的是, 许多老师并不是自己编写阅读试题, 而是直接从网上或其他渠道照搬原题。如果这种状况继续下去, 设计测试就形同虚设。
因此, 出题者设计阅读测试时应全面考虑。首先, 出题者应对阅读的本质有全面的理解。其次, 文本的选择应该适合学生的英语水平。并且, 除了多项选择外, 还应多思考些其他适合文本的测试题型, 如概要完形填空、连线、排序、判断对错、简答等。应确保一份试卷中至少有两种题型。究竟该用哪种题型取决于阅读文本的类型和学生的水平。
6 小结
测试阅读看似简单, 实际绝非易事。文本的选择、受试者的英语水平、要测试的阅读技巧和测试方法都应全面考虑, 以便能反映出受试者的真实语言水平。本文讨论的相关阅读测试设计理论必将对广大教师和笔者自己的教学产生积极影响。
摘要:本文从出题者的角度概述了如何设计可靠有效的英语阅读测试试卷。出题者考虑的主要因素包括阅读文本的选择、测试的阅读技能及编写测试问题的步骤等。最后, 本文就我国目前英语阅读测试现状给出了建议。
关键词:阅读文本,阅读技能,步骤,建议
参考文献
[1]Hughes, A.Testing for Language Teachers[M].Cambridge:Cambri dge University Press, 1989.
[2]Harrison, A.A Language Testing Handbook[M].London and Basingstoke:the Macmilian Press Limited, 1983.
[3]Heaton, J.B.Writing English Language Tests[M].London and New York:Longman, 1991.
[4]Nunan, D.Language Teaching Methodology[M].Englewood Cliffs, N.J.:Prentice Hall, 1991.
机载软件生命周期环境选择概述 篇8
关键词:机载软件,DO-178B,生命周期环境,工具鉴定
民用飞机机载软件在安全性上的严格要求, 使得其除了在功能、性能上的要求之外, 要求其必须在流程和目标上符合DO-178B[1]的规定[2]。DO-178B作为机载软件开发的适航标准, 约束着机载软件开发的开发、验证、配置管理和质量保证等方面。相对于其它行业商用软件的开发过程, 机载软件对于软件生命周期材料的置信度水平有着严格的要求。简言之, 只有达到了DO-178B中的附件中10张表的目标, 才能够判定机载软件产品达到了适航要求, 才有在SOI审查中获取适航当局认可的可能性。
在机载软件项目筹划过程中, 除了要对机载软件开发项目的范围、目标和资源进行统计和估算外, 同样作为机载软件开发的重要基础的是软件生命周期环境的规划和选择。软件生命周期环境是生产高质量软件的重要因素。软件生命周期环境选择不当会对软件质量产生不利影响, 造成项目的风险甚至是项目失败的结局。
软件生命周期环境的核心是开发工具、编译工具和验证工具。工具选择的基本原则是“选择需求开发和限制引入错误机会的设计方法、工具和程序设计语言以及保证能检测到引入错误”的验证方法。除此之外, 工具及其集合可能带来的流程重入, 适航上的要求等也是关键的影响因素。这些考虑可能影响到:生命周期环境的完整性、工具的有效性和效率、工具鉴定工作量、流程与工具的配合等等。本文拟对机载软件生命周期环境的选择考虑因素作出概述, 供机载软件开发时构建软件生命周期环境参考。
一、生命周期环境选择的考虑
1.1开发环境选择的考虑
软件产品依赖于软件开发环境的能力和质量。生命周期环境中的工具是否有其它型号上的适航经历, 是否有软件供应商的可鉴定支持包关系到将来适航是否具有可行性。在供应商的可鉴定支持下, 是否对于该工具有合格使用指南, 且使用方所提交证据的多寡, 也是在工具之间进行选择的考量因素。软件之间是否具备较好的协同和衔接特性, 是否容易与其它工具软件进行搭配和形成完整的生命周期环境。由于工具本身的内因性特点, 有时也会引起软件产品本身的诸多的错误或者隐性缺陷。例如, 某些建模软件在自动生成代码时, 会引入大量的模式代码, 这样就对后期的覆盖率分析带来麻烦, 而有的工具则刻意用C代码实现了面向对象的一些概念, 在软件验证阶段将会带来巨大的麻烦。对于某些带有配置选项的工具, 还要定义一定的使用规则和检查手段, 这也是工具选择时需要注意的。
1.2语言和编译程序考虑
源代码进入编译器进行编译、链接、生成目标码, 目标码翻译为二进制机器码。优化是一个编译的必经环节。未经优化的目标码将是不可能执行的。不同优化等级, 又会在性能和功能之间进行平衡。源代码在编译器中进行优化, 会对目标码的结构、执行顺序等等进行调整, 可能会引起目标码和源代码之间追踪性的丧失。编译器还会在目标码层次上进行必要的代码补充, 例如在中断服务程序执行期间, 会自动关闭中断使能, 在中断服务结束后, 又会自动开启中断使能。那么这些必要的代码可能都无法追溯到源代码。所以在选择编译软件的同时还要考虑如下的方面:
■编译器的优化特性;
■A级软件要求对编译器产生不能追踪到源代码的目标码要进行验证;
■编译选项的更改将引起软覆盖率分析的重入;
编译器的优化性能将使得软件产品在运行效率和空间占用方面产生良好均衡。对于A级软件, 不能追踪到源代码的目标码的验证工作量多寡是考虑因素。任何编译选项的改变都可能对目标码产生影响, 进而引起覆盖率分析结果的变化。
1.3软件测试环境
软件测试阶段除了要完成对代码的静态检查和动态测试, 还有可能对A级软件的目标码进行覆盖率分析。软件测试阶段的工具除了在目标机上直接进行测试, 还有可能对设计阶段的模型进行仿真。依赖于不同模型软件工具的不同, 对仿真工具有不同的要求。由于仿真器和目标机之间的不一致所到影响到的测试结果, 需要在目标机上进行重做。所以仿真器的能力及其与真件的差异需在建立测试环境时予以考虑。
在覆盖率分析阶段, 由于测试用例的补充和覆盖率数据的递增, 应用测试管理工具能够维护有效测试用例的选择效率。
1.4软件工程管理工具
对于软件配置管理中的同行评审和变更管理等要求, 由于变更的范围和影响的差别, 变更的裁定、执行和验证亦需要一定的工具支持, 才能将配置管理计划中定义的流程充分制度化。对于异地协同的团队来说, 支持远程异地协同的配置管理方式也是非常必要的。
对于软件工程管理来说, 为保证软件需求开发、概要设计、详细设计、集成综合、验证确认工作的充分有序进行, 也同时需要相关的工具支持项目的推进。
二、主要工具支撑
软件开发工具的发展促成了软件开发的高速度和高质量。工具的发展从单项工具的开发逐步向集成工具的开发发展。软件开发方法的有效应用也必须得到相应工具的支持, 否则方法将难以有效地实施。工具的完善和发展将促进软件开发方法的进步和完善[3]。根据机载软件项目的典型性, 一般应具备如下的工具支持:
■需求开发工具:需求的开发、追踪、基线维护和评审状态维护;
■架构建模工具:概要设计、架构设计与行为定义;
■设计建模工具:详细设计、低级需求开发;
■代码生成工具:模型代码生成、手工代码融合支持;
■追溯性管理工具:需求、设计、测试追溯性支持;
■静态代码检查工具:源代码编码标准符合性检查;
■动态代码测试工具:功能测试、覆盖率测试;
■编译工具:目标机可执行文件生成;
■可加载格式文件生成工具:机载软件加载格式生成;
■测试管理工具:测试用例、测试脚本、测试结果和测试平台集成;
■配置管理工具:版本管理、基线管理、变更管理;
■项目管理工具:项目计划、估算、风险控制、成本合算、质量保证;
■仿真验证工具:半实物仿真、仿真激励。
软件工程环境是全面支持软件开发过程的软件工具集合。对于上述的工具, 有些无需购买专门软件, 在成本和效率的权衡下可配备开源工具。在拥有上述的工具支持下, 最好能够通过脚本或者某一个工具为中心进行工具链的整合, 为开发人员配备一揽子的开发解决方案。
三、工具鉴定的考虑
按照DO-178B的要求, 凡是某项活动因为工具的原因得以取消、减少或者自动进行, 并且输出无需另外验证时, 那么就需要进行工具鉴定。工具鉴定的目标是确保工具提供必须的适航置信度, 这种置信度能够等效于所取消、减少或者自动进行的这些活动所带来的置信度。换言之, 软件开发和验证工具的研制流程和机载软件是类似的。按照工具鉴定的要求确定的工具类型:软件开发工具和软件验证工具, 其中软件开发工具可能会引入错误, 这是因为开发工具的产物会进入产品中。而软件验证工具的产物不会进入产品, 但是却会对错误进行误判或者漏判。在工具鉴定过程中, 若是不能确定工具的类型, 则需按照开发工具进行鉴定。显然, 软件开发工具的鉴定更加严格和复杂。同时, DO-178B也规定, 进行工具鉴定的工具研发过程亦需遵循软件配置管理过程和软件质量保证过程, 亦需进行工具鉴定。开发工具的鉴定准则包括:DO-178B定义的开发过程目标要在工具的开发过程中进行满足;工具的软件等级原则上等同于所生产软件的等级;申请人要在工具验证阶段验证其输出及工具相关的问题;由于工具软件的系统需求是工具操作需求, 那么工具鉴定自然就取消了诸如对于目标机符合性、可验证性、追踪性的需求。
验证工具的鉴定准则是仅需验证通过正常条件下工具符合工具操作要求的证明来实现即可。
另外, 工具开发过程中, 开发工具要按照CC1类进行配置管理, 而验证工具按照CC2类进行配置管理。
四、结论
机载软件生命周期环境的选择牵涉到开发计划和开发执行, 影响到软件适航审定, 必须对软件工具的工作要求和适航需求进行综合考虑, 才能够支撑机载软件全生命周期任务的顺利完成。
参考文献
[1]DO-178B.Software Considerations in Airborne Systems and Equipment Certification[S].RTCA/EUROCAE, 1992.
[2]岳庆敏.软件适航认证与DO-178B, 航空制造技术[J].北京旋极信息技术股份有限公司, 2011.
软件安全性设计方法概述 篇9
软件安全性是一个广泛而复杂的主题。要使软件免受各种可能类型的攻击是不切实际的。特别是B/S,B/S/S和C/S模式下的软件,客户端和服务器端需要实时进行通信和数据传输,安全性更为关键,也更加重要。典型的网络应用模式如下图:
为提高软件安全性,降低使用过程中的风险。可以在设计和构建软件时运用一组优化的原则来尽量避免各种攻击。以下介绍常用的几种方法。
一、服务器端验证代替客户端验证
采用服务器端验证方式,保障软件自身的安全性。
在复杂的、并且用JavaScr ipt客户端封装的应用程序内,经常遇到对用户输入信息执行大量检查的Web页面。即使HTML元素具有数据有效性的属性也是如此。只有在成功验证所有输入信息后,才能提交HTML表单。结果,一旦服务器端收到通知表单(请求),便恰当地执行业务逻辑。用户通过在浏览器窗口中键入适当的URL,可以发送任何“posted”表单,尽管通过禁用这些页面的GET请求,也很容易地阻止这样的“表单发送”。但是,不能阻止人们模拟甚至创建攻击者自己的浏览器来入侵系统。
采用服务器端验证是构建安全Web应用程序时,不管在客户端一侧输入的是什么,它可以确保客户端送往服务器的所有数据都是真实有效的。因而,服务器端验证可以提供真正应用程序级的安全。
二、服务器端分页
采用服务器端分页技术,降低消耗,提高通信的安全性。
在进行大数据量的传输时,软件设计者并不希望将大量数据同时传递给用户,这样会降低系统性能,消耗系统资源,而是在用户需要的时候,才把需要的那一页数据传输过去。其实用户的阅读速度也限制了他不可能同时浏览如此多的信息,也许他只需要前几十条数据。客户端分页虽然也提供分页显示的功能,但实际上数据已经传输到了客户端,所以服务器端分页不但为资源的优化提供了很好的解决方案,由于数据的分次分批传输,也减小了泄密的可能性。
三、使用安全协议传输
安全协议是以密码学为基础的协议,它在网络和分布式系统中提供各种各样的安全服务,有着大量的应用,起着“桥梁”的作用,在信息系统安全中占据重要的位置。采用安全协议传输加强网络通信安全,提高实时通信的可信度。
(一)SSL协议
SSL (Secure Socket Layer)协议,又叫“安全套接层协议”,是一个用于进行保密通信的安全协议,最初是由Netscape Communication公司设计开发的,主要用于提高应用程序之间数据的安全系数。由于SSL具有应用面广、实施成本低、安全高效、操作简单等优点,它已成为电子商务系统中应用得最广泛的协议,它融合了多种安全技术,实现安全的Web通信。它位于TCP层和应用层之间,对信息传输起到了加密和认证的作用。发送时信息用对称密钥加密,对称密钥用非对称算法加密,再把两个包绑在一起传送过去。接收的过程与发送正好相反,先打开有对称密钥的加密包,再用对称密钥解密。
SSL协议的整个概念可以被总结为:一个保证任何安装了安全套接字的用户和服务器间事务安全的协议,它涉及所有TCP/IP应用程序利用数据加密技术,可确保信息在网络上的传输过程中不会被截取及窃听。其提供的主要服务有:认证用户和服务器,确保数据发送到正确的客户机和服务器;加密数据以隐藏被传输的数据,防止中途被窃取;维护数据的完整性,确保数据在传输过程中不被改变。
SSL提供了两台机器间的安全连接,弥补了TCP/IP协议的不足,使得在网络上传输数据得到安全保障。目前,较大型的应用系统进行表单和CA的认证时一般采用这种协议传输。
(二)HTTPS协议
HTTPS安全超文本传输协议,用于安全的HTTP数据传输,即HTTP下加入SSL层,其加密方式和SSL相同。使用了HTTPS协议的软件在访问的时候地址用https://开头。
(三)SET协议
SET (Secure Electronic Transact ion)是安全电子交易协议,是为了进行在线交易时保证信用卡支付的安全而设立的一个开放的规范,主要是为了解决用户、商家和银行之间通过信用卡支付的交易而设计的,以保证支付信息的机密、支付过程的完整、商户及持卡人的合法身份、以及可操作性。SET中的核心技术主要有公开密匙加密、电子数字签名、电子信封、电子安全证书等。
SET是一种基于消息流的协议,是一个非常复杂的协议,SET还定义了加密信息的格式和完成一笔卡支付交易过程中各方传输信息的规则。在实际软件开发中使用得比较少。
四、数据干扰
采用数据干扰技术,增强软件的使用和管理安全。用以上安全协议进行加密、认证会导致性能下降,所以一般只针对重要数据传输才使用。对于一些不用直接阅读只用于验证比对的信息,可以不用安全协议进行加密传输,可以直接将其敏感信息加密进行干扰,比对的时候直接进行密文的比对。例如一些文本信息,可以用简单的二进制移位运算后存储在服务器上,即使黑客得到了这些文件也是密文,不能直接使用,或者用户的用户名和密码等重要信息通过MD5单向加密后存放在数据库中,可以有效地防止非授权人员查看、非法获取和非法使用。
五、对Sess i on进行管理
减少session会话的使用,并且对其进行超时管理,提高软件使用过程的安全性。
一种方法就是当程序使用完session中的存储对象后,立即主动从session中将其删除并释放,这样这些对象就不会长时间的浪费系统资源。通常情况下,可以选择简单地让缺省的超时(timeout)来处理暂时存储的数据,但是这样一方面占用了系统服务资源,另一方面也影响到系统的安全。因为如果一个用户用他的账户结束了访问,离开了浏览器,但由于某种原因没有关闭浏览器,那么首先该用户已经不再需要系统服务,就不希望他继续占用系统资源;另外也不希望其他人“借用”该用户的身份进入系统。一般情况下,操作系统都安装了身份认证系统,但不能防止在屏保起作用之前他人进行非法操作。
另一种方法是将这些存储在session中的对象,改为通过request来传递,对用户每次执行系统服务后产生一个新的标识,并将此标识及其指定的数据再定向并通过request传送到下一个应用服务中,依次传递。request在请求结束后是自动被系统释放,所以不会长时间浪费系统资源。对于那种不需要维持太久状态并且使用频度不高的过程可以考虑采用这种方式。
六、最小权限
将用户访问权限限于执行任务所需的最小权限,并且该访问只延伸尽可能短的时间。提高软件系统信息访问安全性。
软件设计时不使用数据库默认的管理员账户连接数据库,连接Microsoft SQL Server数据库不用sa用户,Oracle数据库不直接用system用户连接,只能用其他用户连接,并且设定较复杂的密码。目前Oracle已经做到了这一点,用其他用户连接数据库时,该用户一般没有数据库管理员的权限,而仅具有最基本的权限。以此,可以有效地保护数据库服务器上其他数据的安全。
用户在应用系统中的权限也严格加以控制。对角色权限进行细分,一种角色对应一个较小的权限,一个用户的权限就是由几个或更多这样的小角色组成。如果一个用户只需要一个很小权限就能做的事情,那么系统管理员不必给他分配一个超过他需要的权限,而他有可能利用这个权限“合法地”去做“非法”的事情。
七、小结
软件安全是信息安全的一个分支,而信息安全是一门涉及计算机科学、网络技术、通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科的综合性科学。要保障软件安全,需要对整个网络系统的信息安全进行综合防护。
并不是用了以上方法设计出的软件就是绝对安全的,所谓“道高一尺,魔高一丈”,每种方法都有其不完善之处。在实际设计过程中,还要权衡软件的易用性、可用性和总体性能来充分考虑软件的整体设计和综合防御。
摘要:计算机软件安全性一直是开发者和用户对软件性能的主要关注点之一。本文主要介绍了软件设计中几个提高安全性的方法,比如用服务器验证代替客户端验证,服务器端分页,使用网络安全协议进行数据传输,对敏感数据干扰存储,加强session的管理,授予用户满足需求的最小权限,以此提高信息的安全,降低软件风险。实际应用证明,这些方法是有效可行的。
关键词:计算机软件,安全设计,网络协议,软件设计
参考文献
软件测试概述 篇10
关键词:时刻表,FALKO
一、时刻表功能概述
地铁时刻表系统是地铁运营系统中一个重要的子系统, 它主要实现了地铁行车组织的工作计划编排, 并且根据不同的运营情况及要求, 为地铁运营设置安全高效的行车间隔, 并使其达到资源最优化。
二、FALKO功能概述
FALKO软件是时刻表编辑软件, 是一个用来创建和考核铁路系统运行时刻表的软件。利用创建时刻表的功能, 可以考虑实际运行方面的相关要求, 在很短时间内创建一个完整的图型化的日运行时刻表。通过使用高自动化生成功能, 可以优化车辆周转, 生成详细到各进路区段的实际可行的运行时刻表。在事件驱动模拟演示器的帮助下, 可以接近实际地演示运行时刻表在实际铁路系统中的运行过程。利用这个功能, FALKO可以在考虑所有重要的技术限制条件和运行限制条件的前提下 (譬如:列车动态运行情况, 乘客流量) , 以高度的可靠性来验证或推翻常规时刻表、备用时刻表或时刻表片段的可行性。因为FALKO可以实现在模拟期间设置一些运行中可能出现的故障或干扰, 如暂时的车门、道岔以及限速区故障, 由此可以方便地检测已通过可行性验证的时刻表的稳定性。通过使用各种各样的分析功能, 可以对生成的时刻表进行详细的评估。
三、FALKO软件编制时刻表流程
图1阐明了FALKO内部数据流以及各功能模块的相互合作关系。
创建时刻表的过程是这样的:
首先使用时刻表编辑器制出一张符号式的时刻表, 然后通过时刻表扩展和车辆周转计划生成器产生单次行车及车辆周转计划。运营计划模块将车辆周转计划精细到车站轨道。根据接收到的发车指示可最后由选线计划模块生成一张具有准确进路的有效运行时刻表。利用全局优化模块可以将一个符号式时刻表 (譬如:一个复杂的线路网) 将其相关换乘时间及其能量消耗进行优化。在模拟器内行车控制/行车跟踪模块将有效运行时刻表转化为进路要求如发车、停车及换向命令, 其中过程模拟器模仿列车、外部设备及乘客的行为。联锁模拟器在ATP模拟器的配合下保证列车运行的信号技术安全。模拟期间, 模拟后的时刻表由过程模拟器输出。FALKO创建的时刻表─不论是车辆周转计划、原始时刻表还是有效运行时刻表, 在经过接下去的验证后可在时刻表输出模块的帮助下以相应的外部时刻表格式输出。
四、结束语
随着系统的逐渐深入, 对于编辑基本的时刻表运图已经不再困难, 但在运营要求日益提高的今天, 如何能够设计出一个完美的时刻表, 关键还是要对于时刻表编辑软件有深入的了解并能够结合实际运营需求, 这样就能够让时刻表系统更好的服务于地铁运行。
参考文献