精华内容
下载资源
问答
  • 科学研究设计六:有效性威胁

    万次阅读 2017-11-18 08:46:51
    内部有效性和外部有效性

    说明

    这是Bangor University 2007年School of Sport Health & Exercise Sciences的教学讲义,大家可以在这里查看原课程的讲义

    课程目录

    为什么要看这个?

    这个在我看来,适合大学生或者刚入学的研究生学习,主要为了提高科学素养、培养科学研究的思维以及一些研究设计中要考虑的很多细节问题。虽然里面没有很多高超的方法,而且课程也是十年前的,但是里面对于科学的理解以及思考问题的思维方式确实值得刚进入科研这条不归路的人学习。

    格式说明

    1. 标题格式都按照markdown排版的,但是标题之间的关系可能没有排好,主要是参考了原课程网站的标题设计
    2. 书中一些专有名词或者大牛们说的话都没有翻译,以防止因为我的问题导致误解
    3. 名人名言和我自己的理解都是用引言格式标注的,不同的是,大牛们的话是英文,我自己的理解是中文
    4. 因为课程中有问答环节,问题我会用加粗来标识,问题的答案一般会用斜体来标识

    最后一句话

    因为本人英文水平有限,有些话翻译得可能很别扭,有能力的话建议大家去看原网址。

    这里写图片描述

    内部有效性和外部有效性 Internal and external validity

    在第四课(实验设计)中,我们介绍了潜在的自变量问题:可能会有一些导致因变量变化的非受控因素。这些因素被称为研究的内部有效性威胁(threats to the internal validity)。因此,内部效度与研究的设计在多大程度上使我们将因果性归因于自变量并排除了潜在的其他解释。研究者的任务是设计研究,排除合理的替代解释,以确定是造成这一效应的自变量。

    内部有效性就是说,研究的目的就是为了确定因变量的变化只受自变量影响,排除其他的不受控因素。国内也有人翻译为内部效度是因变量和自变量之间关系的确实性程度,是实验结论的真实性。

    研究有效性的第二个方面涉及研究设计在多大程度上允许我们将结果推广到非抽样样本的人群,或不同环境或不同时间的类似人群。这被称为外部或生态效度(ecological validity)。外部效度是关于应用于现实世界的结果是否有意义。

    外部有效性,或者叫外在效度(external validity)是指研究结果的代表性或普遍性。具体说来,就是指研究结果是否可以推广到类似情景中去的程度。

    内部有效性Internal validity):研究设计在多大程度上可以将因变量的变化归因于自变量的变化?

    外部有效性External validity):我们可以在多大程度上将研究结果推广到其他人或环境?

    在本课中,我们将详细研究有效性面对的主要威胁以及不同的研究设计如何对其进行控制。从一开始就要注意到,需要考虑研究的特定环境来评估不同有效性威胁的可能性。在某些情况下,特定威胁可能根本不适用。

    对有效性的威胁可以大致分为三类:与时间流逝(passage of time)相关的威胁,与参与者选择( selection of participants)相关的威胁以及与测试和操纵相关的威胁。后一类包括反应性安排,将分开处理的多种威胁。

    与时间流逝有关的威胁 Threats relating to the passage of time

    与时间的流逝相关的威胁无论何时使用重复的措施设计都是潜在的问题。 这个类别有五个主要的威胁:成熟(Maturation),历史(History),死亡率(Mortality),仪器(Instrumentation)和统计回归的平均值(Statistical regression to the mean)。

    成熟(Maturation)

    这种威胁与时间的推移有关,例如发展变化,衰老,饥饿,疲劳等。例如,假设一位教育研究人员有兴趣评估8岁儿童使用新的阅读方法的效果。 研究者考虑使用一个单一的组,前测(pretest)后测(posttest)设计:

    O1XO2

    对一类儿童的阅读能力先进行评估测量,进行一段时间的新方法阅读的课程,再对阅读能力进行评估测量。 这个设计有什么问题?

    很明显,不论具体的教学方法如何,孩子的阅读能力都会随着时间的推移而改善。 因此,在前后测量之间观察到的任何改善可能是由于人本身成熟:儿童自身认知的变化。 新方法可能是有效的,但是我们不能把它的影响与那些已经发生的影响区分开来。

    意识到他的错误后,研究人员决定采用随机前测后测控制组设计:

    RO1XO2RO3XO4

    儿童被随机分配到两组中的一组。 一组接受阅读课程,另一组接受“标准”教学方法。对这两个组的阅读能力进行前测试和后测试。 这是如何控制成熟的影响?

    假设结果提示新的教学方法优于标准方法:

    这里写图片描述

    两组阅读能力都有所提高,但接受新教学方法的实验组提高得更多。由于孩子是随机分组的,所以应该在阅读能力和其他相关因素上应该是相同的。因此,任何发生的成熟的变化将同样适用于这两个群体。对照组的改善是由于正常的年龄变化,而实验组的更大的改善则可归因于新的教学方法,只要在操作中没有其他潜在的自变量(有效性威胁)。例如,管理新教学方法的人只是一个更好的老师,或者比使用标准方法课程的人更有动力,更热衷于使用新方法的前景。正因为如此,实验组的人员才能以更快的速度发展。那你怎么能避免这些潜在的影响因素呢?

    要想完全避免是很困难的!当然,你可以让同一位老师使用这两种不同的方法教学,但是再一次,他们可能会更有动力使用新方法。 在某些情况下,比如医药领域建立的研究可以使实验者不知道他们正在提供哪种治疗以避免上述提到的问题。例如,在评估新药疗效的医学研究中,采用双盲(double-blind)程序是正常的:参与者本身和实验者都不知道参与者是否正在接受药物(或药物的剂量)还是安慰剂(即没有药效的试剂)。但是显然,在这个例子中你不能用这个方法。 老师怎么会不知道他们使用了哪种教学方法? 如果你能想到一个方法来解决这个设计问题,你将会对科学做出重大贡献!

    成熟(Maturation)我们可以理解为参与实验的人自身的年龄的变化会导致认知等的变化,如果试验周期长,这种变化是研究者无法避免的。现在面对这个问题,主要的方法就是使用双重差分模型(difference-in-differences model),就是第二个改进的设计。这在预测问题中经常出现,比如我们要考虑汽车的销量,那么我们第一个要避免的就是随着年份的增长,经济形势的好转,汽车销量自然是增长的,首先要将这个原因排除在外。

    历史(History)

    历史是指除了可能影响因变量的实验操作之外,在事前和事后测试之间发生的事件。成熟(maturation )效应是参与者自身发生的事件(happening within participants),历史效应是除了实验人员的干预因素外,发生在参与者身上的事件(happening **to **participants)。

    举一个例子,假设一家大公司决定推广健康饮食,减少吸烟和增加劳动力的体力活动。为推行这些与健康有关的行为而给予工人财政奖励。该方案通过测量实验之前和之后随机抽取的工人样本的饮食,吸烟和活动习惯来评估。在这里,我们有一个单一的组,再次进行前测后测设计。假设在该计划运行的同时,地方卫生当局开展了针对整个社区的重大健康促进举措。这些举措包括提供关于健康生活方式的信息和建议,通过当地超市,休闲中心,媒体等宣传。在这里,我们有一个可能影响公司方案结果的历史事件。劳动力队伍中的任何健康行为的改善都可能是由于他们所面对的更广泛的社会的健康促进举措,而不是公司的财务激励。

    随机对照组设计(有或没有预先测试)的历史威胁完全相同,正如他们控制成熟的影响一样。如果这些组通过随机分配进行了前测,那么任何历史效应都应该平等地影响这些实验组。因此,除了由于历史事件而在对照组中观察到的任何变化之外,实验组中的任何变化都可以归因于自变量。

    这个已经不算是什么大问题了,随机对照组就可以避免这个问题

    死亡(Mortality)

    死亡威胁与前期和后期测试之间实验参与人员的退出有关。我们已经在采样课上遇到了这个问题。退出可能与留在研究中的参与者有着系统的不同。因此,当参与者退出时,样本的性质发生变化。在一个单独的小组研究中,这意味着在预测试开始的样本至少可以合理地代表感兴趣的人群,但是在后测中可能不具有代表性。例如,假设进行一项研究来检查激励强化治疗对坚持使用单一组的锻炼计划的效果,即前测后测设计。没有动力的参与者可能会退出,留下更多积极的参与者。任何明显的锻炼增加都可能是因为最后离开的参与者无论如何都有强烈的动机去坚持这个计划,与治疗可能无关。

    但是,我们已经讨论了单组设计薄弱的两个原因,还有更多的原因。一个随机前测后测的对照组设计成什么样?在这里,和前两次的威胁一样,随机化也是为了弥补这个问题。如果参与者被随机分配到组,那么他们应该在动机和任何其他可能导致推出的因素上是相同的。因此,如果有推出的情况,同一类人应该会从两个群体中推出。

    然而,死亡仍然可能会出现问题,特别是如果治疗费时或需要代表参与者的努力。假设我们使用随机前测 - 后测对照组设计实施了研究,以评估动机治疗对于坚持锻炼的有效性,并且使用包括参加四个一小时长的激励增强课程,另外还提供了一个遵守数据的锻炼课程。对照组不需要参加任何这样的课程,仅仅是练习课程。尽管这两组在初始随机化方面动机因素是等同的,但由于涉及的时间和精力,动力较小的参与者可能会退出治疗组。因此,治疗组缩小的方式与对照组无法比拟。对照组中有更多或更少动力的个体在后测中保持混合,但实验组仅包含更多有动力的个体。因此,在后测中治疗的任何明显的优势可能仅仅是由于参与者的动力而不是治疗。

    所以,死亡率只有在群体之间没有差别死亡(differential mortality)(即不同类别的人从不同群体中退出)时才被控制。如果你做了这项研究,想想可能会有什么后果,而且你遇到了退出,但没有差别死亡率。这可能导致其他的问题吗?

    这里的问题是,虽然这些群体的性质可能没有差别,但它们将会发生变化。 假设有些人从两组中推出,人数相似,因为他们觉得练习课太难了。 现在对操控变量的任何明显的优势只适用于那些没有发现这些课程太难的人(比如更有动机的人,更合适的人,或者已经习惯了的人等等)。 这意味着我们不能把结果推广到为动机不强,不适应,不活跃的人。 那么在这种情况下,我们就有一个外部效度的问题:不能将我们的研究结果推广到其他类型的人。

    仪器(Instrumentation)

    通常情况下,这是一个更直接的威胁。当测量因变量的方式在试验前和试验后或者在不同组之间有变化时,这是一个问题。这可能是由于仪器的校准错误,使用不同的仪器,或者由实验者以不同方式使用仪器所致。

    在我以前作为医院手术室技术员时,我曾经测试过五个电子血压计,都是同样的品牌。他们给了五个不同的读数,变化多达10毫米汞柱!假设我在研究中使用它们来评估放松对血压的影响。我使用一个组,前测后测设计。在预测试中,我碰巧使用了一个低于在正确的值5毫米汞柱的测量仪,而在后测中我使用了一个测量值超过正确值的5毫米汞柱的测量仪。即使实际上治疗已经使血压降低了5毫米汞柱,我也不得不得出结论,放松实际上会增加血压!因此,教训是,确保您使用的是正确校准的仪器。

    如同观察性研究,当研究人员本身就是仪器时,仪器也可能是一种威胁。假设进行一项研究来评估训练教练是否给予正面的反馈,实际上是增加了他们对正面反馈的使用的机会。我们通过观察员在训练期间记录实例来评估提供的积极反馈,然后我们给予治疗,并再次观察教练,看看他们是否使用更积极的反馈。假设实际上培训没有效果,教练对积极反馈的使用不会增加。你能想出为什么观察者可能会在后测中记录更多正面反馈实例的原因吗?

    观察员可以更加熟练地注意和记录正面反馈的情况,因为他们有更多的观察教练的经验,因此即使实际上没有变化,他们在后测中也会比在前测中记录更多的实例。 由于这个原因,观察性研究通常使用多个的观察者,并在观察中训练他们,直到他们达到预定的一致性水平(回顾测量课的评价者间信度)。

    这种现象同样出现在数据分析中,特别是如果你的代码中需要随机值(比如在切分训练集和测试集时),请确保每次实验的随机值是一致的。另外,如果你需要记录实验时间,请确保你的计算机两次实验都在相同或类似的资源使用条件下。

    统计回归的平均值(Statistical regression to the mean)

    这是一个复杂的统计现象,可能发生在试验前后测量设计中。每当我们进行试验前测量时,因为某些在后测中不会出现的因素,有些人会在变量上得分较低或较高。那么当你采取后测方法时,那些人不会再得分那么低或者高。例如,假设我在本课中给了“研究方法”课多选题测验。你们中的一些人会做一些幸运的猜测,并给出你不知道答案的问题的正确答案,所以你的分数将被夸大(即蒙对答案了)。这样做的效果就是把课程的平均分数向上拖动。如果我稍后再给你们进行第二次相同的测试,那么第一次碰运气的人不太可能再做对。所以在后测中班级的平均值会更低(运气没有那么好,不可能每次都蒙对)。

    许多因素可以产生这种回归假象。对于个人,可能只是觉得这一天很糟糕天,心情不好,没有集中注意力或者什么的,而且可能很难确定是什么导致了这个问题。当在一些准实验设计中根据前测的极端分数选择组时,统计回归极可能发生。回想一下,我们在前一课中讨论了这种方法(the regression-discontinuity or cutoff design)。这里的问题是,一些参与者只会在前测中得到极高的分数,这只是由于在后测中不会运行的因素(比如,运气)。当参与者被随机分配到组中时,回归不会是一个问题(提供随机化的工作),因为导致“误导性”极端分数的因素将随机分布在组中。

    不幸的是,随机化并不总是奏效。我们曾进行过一项研究,评估松弛治疗对术前焦虑和麻醉困难的影响。将松弛治疗与在相似时间段中听短文(注意控制条件;稍后更多)和使用随机前测后测对照组设计的无治疗对照条件进行比较。当绘制时,放松和不治疗组状态焦虑的变化结果如下所示:

    这里写图片描述

    为清楚起见,我在这里省略了注意控制条件的结果。 他们一直在中间。 只要你看到这样的结果,就应该想起这些警告。 显然,尽管随机分配,这些群体在试验前的测试中焦虑并不相同。 因此治疗组的焦虑明显减少和对照组的增加可能归因于统计回归。 当我们把这项研究提交出版的时候,我们很快就指出了这一点。 幸运的是,我们还有其他数据来解释,并且这篇文章发表了。

    与参与者选择相关的威胁 Threats relating to selection of participants

    这些威胁涉及在多个小组研究中给参与者分配治疗条件时引入的偏差。

    选择偏差 Selection bias

    这种威胁涉及将参与者分配给群体时由差异选择产生的偏差。 如果一开始这些小组是不同的,那么在对其中一个小组实施治疗之后,无论治疗是否有效,他们很可能会有所不同。 例如,假设在我们放松术前焦虑研究中,我们将更多焦虑的参与者分配给控制条件,而不那么焦虑的参与者放松治疗条件,并使用静态组比较设计:

    NXO1NXO2

    我们可能会发现,放松组治疗后焦虑不如对照组。 显然,这可能是因为放松小组无论如何都不那么焦虑。 很显然,随机分配到组可以避免这个问题,因为这些组在预测试中是相等的。

    威胁可以相互影响 Threats can interact

    在多组研究中,选择偏差可能与我们已经遇到的以及未来的威胁相互影响。 例如,我们可以选择X为成熟。 在这里,如果存在差别选择,则因变量的变化可能是由于一些群组中的成熟变化而不影响其他群组。 例如,如果一个治疗组的成员比对照组年轻,那么治疗组的任何变化都可能是由于成熟,而不是治疗本身。 或者我们可以选择X为历史。 在这里,如果存在差别选择,则因变量的变化可能是由于在另一组中经历的历史事件而导致的。 如果一组在预测试中是极端的(相对于总体均值),那么我们也可以选择X回归,而其他组则不是。

    选择X Selection X manipulation

    选择X互动是相当不同的。在这种情况下,操纵的效果只适用于特定人群的抽样。因此这是对外部有用性的威胁。例如,大量的心理学研究已经使用本科生作为参与者,只是因为他们很容易掌握。然而,本科生与普通人群在很多方面有所不同。例如,人们希望他们比一般人更聪明,受教育程度更高。那么,我们可能会质疑,从本科生获得的结果是否适用于一般人群。

    同样,在体育科学方面,大量的研究都使用竞技表现较低的体育表演者,因为很难有更多精英表演参与到我们的研究中来。假设我们发现当与较低水平的表演者进行测试时,一些干预“有效”。我们无法知道,除非我们继续用这种人群进行测试,否则同样的干预措施是否会对精英运动员有效。更进一步。如果我们继续在英超球员上测试干预措施,那么我们怎么知道同样的干预措施对顶级短跑运动员来说同样适用呢?无论内部有效性如何强大,没有设计可以回答这个问题。实际上,这是一个我们必须始终牢记的的普遍的外部效度问题。从逻辑上讲,我们不能将内部有效研究的结果推广到与用于测试干预的人群不同的人群( Logically, we cannot generalise the results of an internally valid study to populations other than the one used to test an intervention)。但是,我们通常没有资源对每一个可能的人口采取干预措施。在结束的时候,我们必须对我们的发现在多大程度上能够推广到不同的人群进行一般化的判断。这就成了一个有效性的问题:从不同的人群中获得同样的结果是否合理?

    采样结果能够视为普遍结果,在样本人群上的研究结果能否视为普遍结果。现在人们说大数据可以不用采样了,我们可以获取全部的信息,但是你确定你获取的是大数据?你的大数据是全部信息吗?

    测试和操纵相关的威胁 Threats relating to testing and manipulations

    这些威胁与测试参与者的行为有关,而且与那些预期行为不同的操纵的潜在影响。

    测试 Testing

    测试效果与在前测对于后测成绩的影响有关。后测分数可能受到前测行为的影响,即在记忆、熟悉测试设置等方面获得的练习的影响。 例如,提高智商分数的最好方法就是进行智商测试! 通常情况下,从第一次IQ测试到第二次测试,分数提高了大约3-5分。 当然,这并不意味着进行智商测试会提高你的智力!

    单组前测后测设计显然会面临这种威胁。 随着时间的推移,任何明显的变化可能只是由于采取了预先测试的行为,而不是由于任何干预。 那么随机前测 - 后测对照组设计怎么样?

    希望现在你已经得到了技能! 如果参与者被随机分配到组中,那么测试效果将在所有组中均等地表现出来。 因此,我们可以确定操纵对实验组的影响,超过了测试本身的影响。

    测试的反应性影响 Reactive effects of testing

    前测可以以更微妙的方式改变人们面对后测反应的方式。例如,假设我们让一些年轻运动员完成关于体育运动中毒品的态度问卷。填写问卷的行为可能会让他们离开,对体育药物的思考比以前更加深入。然后,如果您在以后再次提交同样的调查问卷,他们可能会以不同的方式回答预先测试的问题,而不考虑旨在改变态度的任何干预措施的效果。这也被称为预测试敏感性:预测试使参与者对干预敏感,以便他们以不同于没有参与预测的应答的方式做出反应。测试的反应效果实际上是预测试和干预之间的相互作用。这是对外部效度的威胁,因为如果根据我们的研究,我们认定我们的干预是有效的,那么当我们外出并在现实生活中应用干预时,我们通常不会预先测试个人。你能想到一个可以避免这个问题的设计吗?

    随机后测只控制组设计控制测试效果和测试的反应效果,因为没有预测试!因此,它可以比随机前测后测控制组设计(因为没有预测试致敏的可能性)提供显着的优势,当然,随机化将在预测试中的组视为等同的。

    所罗门四组设计:

    RO1XO2RO3O4RXO5RO6

    也控制了测试的反应性效应,而且由于有一些小组既​​可以进行前期测试,也可以进行后期测试,因此可以确定干预前后干预期间是否有任何变化,没有干预(即由于时间的推移)。正如前面所讨论的,这是随机的只有后测试的对照组设计不可能的,因为用这种设计,我们不能说出对照组在没有干预的情况下随时间变化了多少,因为没有预先测试。*

    但是,正如前一课所述,所罗门设计的实施费用昂贵且耗时。

    反应性安排 Reactive arrangements

    反应性安排不应与测试的反应性影响相混淆。这些是与参与者对研究背景的反应有关的更普遍的一类威胁。本质上,问题归结为:研究环境不是自然的情况,所以我们可能期望研究的参与者表现不自然。换句话说,研究设置可能会影响到参与者做出和现实生活中的不同的反应。

    研究是一项涉及研究人员和参与者之间复杂的人际交往的社交活动。因此,反应安排有时被称为对有效性的社会威胁。与豚鼠或实验室老鼠不同的是,人类研究参与者正在思考,合理化生物,他们总是试图理解他们的情况,解释他们正在发生的事情,并预测他们的期望。这在心理社会研究情况下变得特别成问题。那么,社会对内部有效性的威胁关注的是由于研究背景中固有的社会因素而导致的因变量的变化。

    举例来说,多年来一直有很多争论,是否有可能让人们在催眠下进行一些不催眠情况下的正常表现的行为。六十年代初期的一项研究似乎支持这一观点是可能的。催眠的参与者被告知要拿起毒蛇来玩耍,他们正是这样做的。当然,毒液之前已经从蛇身上移开,但参与者不知道这一点。 Orne和Evans(1965)然后复制这个研究,但没有催眠并且得到相同的作用!当被问到为什么他们做了这么看似危险的事时,与会者回答说,他们知道实验者是负责任的人,他们不会真的把他们置于危险之中。在类似的研究中,奥恩和他的同事设法让参与者犯下各种显然危险甚至是暴力的行为,比如向他人的脸上扔“酸”(实际上只是水)。参与者在实验环境中的表现往往不像平时那样行事,早期实验的结果可能不是由于操纵(催眠)而是由于参与者对情况的认识。

    重要的是要指出,反应性安排不仅是实验研究中的潜在问题。任何研究设置是不寻常的,可能会提示参与者的非特征性反应。如果我拦下了High Street的人们并要求他们填写一份问卷,这对他们来说是一个不寻常的情况,他们可能以不寻常的方式行事。

    实验参与的人既然已经知道了他们是在实验中,那么他们极有可能做出一些与正常生活中不同的事情。

    动机问题 Motivational issues

    每当参与的研究耗费时间,乏味,涉及厌恶的程序,需要经过努力等时,参与者在研究过程中可能失去动机或失去动力,从而影响他们的反应。此外,涉及威胁个人自我的程序或需要披露个人信息的程序可能导致他们以不完全诚实的方式作出回应。

    一个相关的问题是社会适宜性反应偏差(social desirability response bias)。这是一个衡量问题。人们通常倾向于尽可能以最好的方式描绘自己。他们可能不愿透露自己的恐惧或弱点。所以他们可以用他们认为是社会上可取的或可以接受的方式来回应。如果我要问“研究方法”课程,你们中有多少人会挖鼻孔,我敢打赌,你们当中的所有挖鼻孔的人都不会承认。作为一个更严肃的例子,运动员可能不愿意表现出竞争焦虑的感觉。因此,当给予焦虑问卷时,他们的得分可能低于他们真实情况。同样,当被要求汇报身体活动水平时,个体倾向于高估他们自己。他们也许不希望被视为懒惰。在重复测量的随机多组研究中,如果我们假设过度或者低估的倾向是随机分布在群体之间,那么这不是一个大问题。尽管获得的绝对分数是不准确的,但我们仍然应该能够检测到不同时间的差异性变化,因为不同组别的人可能会在不同的场合高估或低估。

    社会适宜性反应偏见是一种相对稳定的人格倾向。有些人比其他人有更好的社会回应的倾向。调查问卷受社会需求响应影响的可能性可以在其发展过程中进行评估。量表可用于衡量以社会期望的方式作出反应的倾向,最显着的是Marlowe-Crowne量表。这要求个人对一系列陈述作出真实或错误的回答。对于一些声明,期望任何人如实或积极地作出回应是极不可能或不合理的。例如,一个声明说“我从不生气”。由于大多数人在某些场合都会生气,因此期望有人对此陈述作出“真实”回应是不合理的。如果他们这样做,那么他们很可能会以社会愿望回应的偏见作出回应。我们可以用两种方式来使用这个量表。我们可以用一个新的问卷来管理它,并将这两个方法的分数联系起来。一个显着的相关性表明新的问卷容易出现这种反应偏差。其次,我们可以通过管理Marlowe-Crowne量表来识别那些倾向于以社会期望的方式做出反应的人,并将他们从我们的研究中消除。为了这个目的,许多人格库存都包含了类似的物品,称为撒谎量表( lie scales)。

    没有设计本身可以控制动机和反应的偏见因素。我们只能尽量减少它们。经常用来维持动机的方法是为参与者提供奖励,例如金钱,学生参与者的课程学分或者参加抽奖的机会。你能想到这个问题吗?

    参与者可能会以不同于他们在日常生活中的反应的方式回应,因为他们正在为奖励或奖励而努力! 所以这样的激励措施可能会引入反应安排威胁

    给予参与者的指令称为教学集(instructional set),可以用来向他们保证他们的答复将被严格保密,除了用于回答研究问题之外别无他用。理想情况下,应该在匿名的情况下进行问卷调查和其他措施:没有名字被采纳,受访者清楚,数据收集者不知道谁在填写哪一份问卷小册子,就像在每个学期结束时我们收集您的模块评估一样。问卷的教学集通常还包括一个声明,让受访者放心,该文书不是测试,也没有正确或错误的答案。这样做的目的是为了防止人们感觉到他们被放在现场,或者他们应该以特定的方式作出反应。

    如果你在自己的研究中使用教学集,注意说话的方式。我曾经有一个最后一年的项目学生告诉她的参与者:“这不是一个测试,也没有正确或错误的答案,我们只是想知道你对锻炼情况的感觉,你的答复将以最严格的信心不会泄露给除了研究人员的任何人。“

    需求特征 Demand Characteristics

    奥恩(Orne,1962)创造了“需求特征”一词来描述研究背景中可能导致参与者预料到研究假设是什么的这些方面。他将需求特征定义为“……向主体传达实验假设的线索的总和”(the totality of cues which convey an experimental hypothesis to the subject)。在设计研究时,我们需要确保我们最小化(即使我们不能完全消除)需求特征。

    需求特征可能非常微妙,但容易忽视。我曾经研究过增强锻炼的目标设定训练的效果。参加者被随机分配到一个目标设定的训练组或一个没有接受目标设定训练的注意控制组(稍后,更多的是关注控制)。在研究结束时,两组都给了一个问卷,用来衡量他们是否设定了有效的目标。这包括评估他们设定具体,困难,可衡量,现实和有时间限制的目标的程度。目标设定训练组在这些尺度上得分显着提高。然而,独立的定量和定性数据表明,实际上他们并没有设定更有效的目标。当然,在制定目标的培训计划中,我曾经训练参与者制定具体的,困难的,可衡量的,现实的,有时限的目标。在后测后,我问他们是否设定了具体的,困难的,可衡量的,现实的,有时限的目标。他们这样汇报是不足为奇的,因为他们预料到那正是我期待的!我不得不得出结论,实验组明显更好的目标设定表现很可能是由于研究情况的需求特征而非培训。

    预测假设 Anticipation of hypotheses

    另一个反应性威胁是参与者对研究目的的理解。首先,他们可能只是误解了给他们的指示。显然,清楚明确地提出指示是很重要的。在开展研究之前进行试点测试有助于发现问题。

    但是,还有一个更为微妙的问题,参与者遵循需求特征或者采取不同的方式。如果参与者知道这个假设是什么,他们可以做以下两件事之一:遵守他们所期望的(所谓的“好”的参与者),或者反抗,故意破坏研究(坏的’参与者)。在任何一种情况下,他们都会以通常不会表现的方式行事。

    为了防止这种情况发生,我们通常会隐瞒参与者的研究目的,尽管出于道德的原因,他们应该事后听取汇报。不过,这并不一定能解决问题。因为他们总是试图理解正在发生的事情,人类参与者往往会试图猜测研究的目的是什么,并考虑到情况中的任何线索(包括需求特征)。他们可能会猜测错误,但无论如何,他们可能会做出遵守或蔑视他们认为的研究目的的反应,而不是在现实生活中通常表现的行为。

    对照组参与者 Control group participants

    被分配到无治疗对照组的参与者可能会导致自己的问题。首先,总是有一个棘手的伦理问题,阻止研究人员认为会有好处的治疗。这在医学和其他关键应用领域的研究中是一个严重的问题。如果我们相信一种新的治疗会改善帕金森病患者的生活,或者患有严重临床抑郁症的患者,那么我们有什么权利仅仅因为他们是我们研究的参与者而拒绝某些人的治疗呢?通常的答案是最终通过研究,我们可以肯定的是,治疗实际上是有效的,或比现有的治疗更有效,我们可以排除有害的副作用。此外,如果我们发现治疗有效,我们随时可以把它交给对照组参加者,尽管对其中的一些来说可能太迟了。所以最后的“更大的好处”胜过了某些个人对待治疗的压力。

    然而,对非治疗控制条件的分配也会对有效性构成威胁,因为个体可能会因为知道自己不会得到治疗而作出反应。假设我在当地的新闻媒体上宣传志愿者参加一项研究,使用饮食改变和体力活动的特定组合研究新的减肥方法的功效。许多超重的人热切地报名参加这项研究。然后我告诉他们其中一半他们实际上不会得到治疗。相反,我希望他们继续正常的饮食和活动模式。你可以想象,他们可能会相当失望。已经显示,对照组参与者可以以两种不同方式中的一种进行响应。首先,令人失望的是,他们可能变得失去活力,实际上吃得多,活动少于平时。这被称为愤怒的士气低落。如果发生这种情况,治疗似乎比实际效果更好。或者,参与者可能会认为“嗯,我会告诉他们我想到的是什么”,并严格地进行更多的运动和比平常更严格的饮食,以获得自己的回归。这就是所谓的补偿性竞争。在这种情况下,治疗可能看起来效果不如实际。

    避免这些问题最常用的方法是采用等待列表控制条件。未治疗组的参与者被提供了在晚些时候接受治疗的前景,经常被告知研究人员没有资源立即对所有自愿参加研究的人实施治疗。因此他们被列入等候名单。这样,至少他们知道他们会得到什么时候的治疗。这个程序可以加强研究设计,因为你有第二波干预,可以看到你是否在第一波再次观察到任何效果。

    非特定的治疗效果 Non-specific treatment effects

    在评估治疗效果的研究中对内部效度的主要威胁是非特异性的治疗效果。这些是治疗方案的一些方面,通常是不可避免的,除了治疗本身的细节之外。例如,我的目标设定培训计划涉及花费相当多的时间与参与者。治疗对他们坚持锻炼的任何影响可能与目标设定的训练无关,但由于他们从我那里得到的时间和关注。这可能使他们觉得特别,也许对我有义务,并使他们加倍努力,定期进行锻炼。

    这些效应通常被称为霍桑效应(Hawthorne Effects),这是从上个世纪初期进行的一系列经典研究中得来的。研究人员正在芝加哥西部电气公司的霍桑工厂进行实验,以确定工作人员的最佳工作条件,以提高生产力。总的来说,无论条件如何变化,生产力都有所提高。在一系列研究中,照明逐渐增加,生产力提高。然后,照明逐渐减少到几乎没有光线的地步,生产力也得到了改善!尽管对这些发现的解释仍然存在争议,但一个普遍的结论是,研究人员给予工人的时间,关注和鼓励导致了奇怪的结果。

    霍桑效应与医学研究中的安慰剂效应相当类似。正如我们前面所讨论的,在评估新药或其他疗法的功效时,一些参与者被给予药物,而另一些则接受一种看起来像药物但没有活性成分的惰性物质。目的是能够确定药物是否在任何安慰剂效应之上有效。安慰剂发挥作用的机制尚不清楚,但毫无疑问,它们确实起到了一定的作用。在这样的研究中,使用双盲设计:研究人员和参与者都不知道谁获得了真正的治疗,谁获得了安慰剂。这样的设计有时用于运动科学研究,例如在检查像磷酸肌酸这样的有效助剂的效果时。霍桑效应与安慰剂效应非常相似,但是由于研究者和参与者之间的社会互动方面的原因。

    另一个与非特异性治疗效果相关的方面涉及参与者对于效益的期望。如果治疗似乎是可信的,并且可能对参与者有效,换句话说,如果他们期望从中受益,他们可能会这样做,而不管干预的实际效果。顺便提一下,虽然这可能是安慰剂效应的一种解释,但是有研究表明,即使参与者不相信治疗效果,安慰剂也可以起作用。

    心理社会干预的问题是,双盲程序通常是不可能的。我怎么可能在不知道哪些参与者正在接受培训的情况下进行目标设定的培训?此外,如果我将目标设定训练与不治疗条件进行比较,则参与者自己将知道他们是否正在接受治疗。但是,通过使用注意控制条件,可以试图控制非特定的治疗效果。这与安慰剂相似。它涉及到随机分配一些参与者的替代疗法,以符合实验干预的时间和参与者收到的关注,但没有任何有效成分,并在可能的情况下,如果可能的话,参与者应该是一个可信的待遇,将工作。当使用可信的注意控制条件时,可以实现单盲设计:虽然研究人员知道哪个组正在接受实验性治疗,但参与者不知道。

    在目标设定研究中,我的注意力控制小组接受了我所描述的“激励性培训”。这需要与参与者在目标设定小组中进行相同的时间,培训他们自我监控他们的健康水平和完成决策资产负债表:自我评估锻炼的利弊。我选择了这些程序,因为当时的文献表明他们不会对运动坚持有持久的影响。然而,我明确地说明了为什么这些程序应该起作用,以便参与者认为它们是可信和有效的。问题是,尽管文献说了什么,这种治疗方法几乎和加强锻炼依从性的目标设定训练一样有效!这是一个普遍的概念。

    实验者的影响 Experimenter effects

    实验者的效果与研究人员自己偏差有关。研究人员通常非常致力于他们的工作。他们的工作或晋升前景往往依赖于良好的研究。他们可能受到名望前景的驱使(尽管不是通常的财富,至少在英国学术界是如此!)。因此,他们希望他们的实验“工作”。这可能导致调查人员在他们的研究中引入偏差,即使他们实际上没有编写他们的数据,他们的研究也会倾向于支持他们的假设。不幸的是,在科学史上有许多故意偏差和数据制造的例子,尽管最终发现了这些匪徒(culprits)。

    然而,一个更微妙的问题是研究人员不经意间或潜意识地引入的偏见。例如,一个研究人员可能比对照组参与者更友善地对待实验组参与者,或给予他们更多的鼓励或关注。在罗伯特·罗森塔尔(Robert Rosenthal)深入研究这一现象之后,这就是所谓的罗森塔尔效应。在一项研究中,罗森塔尔让心理学专业的大学生参加了一个实验室,他们让老鼠在迷宫中跑步。学生们不知道,但他们实际上是实验参与者。他们中的一半人被告知,他们的老鼠“迷宫明亮”:一种特殊的品种,已经被培育成擅长跑迷宫。另一半被告知,他们的老鼠“迷宫迟钝”:一种在迷宫跑的时候不好。事实上,老鼠都是一样的,但发现明亮的鼠类比对迷宫迟钝的鼠类更快地跑迷宫。随后的观察表明,那些被给予所谓的光明老鼠的学生比那些沉闷的老鼠更仔细和温和地对待他们的动物。因此,愚蠢的老鼠比明亮的老鼠更害怕,因此花费更长的时间来跑迷宫。

    罗森塔尔和雅各布森(1968)在一个着名的研究中进行了一个类似的实验,在一个着名的研究中被称为Pygmalion的课堂。为了缩短一个漫长而复杂的故事,教师们被告知,他们的一些学生是“大器晚成”,然后这些学生的学习成绩将有显着的提高。事实上,这些“特殊”的学生是随机抽取的,与同学没有什么不同。在学期结束时,所有的学生都进行了测试,发现后期的“大器晚成” 的学生不仅根据教师的评价表现得更好,而且在标准化的智商测验中得分也明显提高。老师们的期望似乎转化成了他们一年四季如何对待学生,导致这些学生比那些未经标记的同学们有更大的改进。你可以在这里阅读有关这个里程碑式的研究的更多内容。

    所以研究人员很容易对实验的结果不自觉地产生偏见。想象一下,进行一项研究来评估咖啡因或其他有害物质对跑步机跑步表现的影响。鼓励实验组比对照组运行更快或更长时间是非常容易的。正因为如此,尽可能使用双盲程序。但是,正如我们所看到的,在很多情况下,以这种方式来控制实验者的效果是不可能的。就像预期效应一样,实验者的效果可以被测量,以确保不同的群体被实验者以相同的方式对待。你可以给所有的组织一个问卷调查,以了解参与者认识到实验者鼓励他们的程度,建立了融洽关系或给予了特别的关注。有希望的是,调查问卷中各组之间的差异不会显着,说明实验者平等对待所有参与者。

    概括小结 Recap

    我们现在已经详细介绍了内部和外部有效性的主要威胁以及不同类型的设计能否控制它们。以下几点特别重要。

    随机前测 - 后测对照组设计 The randomised pretest-posttest control group design

    这种设计控制了对内部有效性的威胁,只要:

    • 随机化工作(群体相当于预先测试)
    • 所有潜在的自变量,包括反应安排和非特定处理效应等都保持不变
    • 组间没有差别死亡。
    • 与时间的流逝有关的威胁是受到控制的,因为它们应该在每个群体中平等地表现出来
    • 与选择有关的威胁是受控制的,因为参与者被随机分配到群体,所以他们应该相等于任何潜在的自变量。
    • 由于没有预先测试,因此测试威胁被控制。

    后测只控制组设计 The posttest only control group design

    这种设计还可以控制对内部有效性的威胁,前提是:

    • 随机化工作(在前测中群体相同)
    • 所有潜在的独立变量,包括反应安排和非特定治疗效果等都保持不变
    • 组间没有差别死亡率。
    • 与时间的流逝有关的威胁是受到控制的,因为它们应该在每个群体中平等地表现出来
    • 与选择有关的威胁是受控制的,因为参与者被随机分配到群体,所以他们应该相等于任何潜在的自变量。
    • 由于没有预先测试,因此测试威胁被控制。

    外部有效性 External validity

    我们无法控制对外部有效性的威胁。在一项内部有效的研究中,我们只能证明在特定的研究条件下治疗的效果是成立的。我们只能肯定地说,在这个特定的地方,这个时间点的特定人群的预先测试的参与者的治疗效果是如此等等。

    展开全文
  • 自动化测试有效性

    千次阅读 2013-06-14 10:44:31
    自动化测试能否帮助我们我们提升开发效率,关键在于其有效性。如果其有效性可能存在问题,那么可能是什么导致了这种问题的产生呢?对自动化测试产生作用的方式存在误解,对自动化测试能够产生作用所要求的条件存在...

          自动化测试能否帮助我们我们提升开发效率,关键在于其有效性。如果其有效性可能存在问题,那么可能是什么导致了这种问题的产生呢?对自动化测试产生作用的方式存在误解,对自动化测试能够产生作用所要求的条件存在误解,自动化测试分析设计的随意性,自动化测试开发维护的低标准,对自动化测试资产的低准出条件……本文将就自动化测试有效性简单阐述我自己的一点见解,抛砖引玉。

    观念之一:独木难生于漠,密植方育甘霖

          沙漠中间栽下一棵树,枯死只是迟早之事;即便有足够的资源让它能够永久地生存下去,而它除了给路过的摄影师的构图上增添一分绿色气息,便再也没有其它存在的意义了。如果要想它能够长久而有生命力地活下去,并期望它能够改善生态,那就需要将其根植在一片密林之中。自动化测试,尤其是前端自动化测试,如若离开其他层次的自动化测试和技术手段与之相互配合,便会如同这棵沙漠中间的树一样,不久便灭。

          五一节后的周五下午和两个开发经理一起review一个项目的性能测试需求,休息闲聊时顺道提到了其中一位开发经理所负责的公网系统CI连续飘红的问题。他坦言自己对自动化测试是不信任的,认为自动化测试发现不了任何问题,从而对CI带来的帮助表示怀疑,因此不愿意在CI上投入过多的精力。我理解这位经理的感慨,认同他对自动化测试有效性的担忧,但是这并不能使我认同他对CI和自动化测试的态度。而对于软件开发来说,没有自动化测试、没有CI,我们可能无法期待更高效率的开发和更好的质量保证。但他这是因为没有耐心地植下一片树林,才导致他心目中自动化测试这棵大树的死亡,进而却又否认这片树林存在的意义,是不妥的。

    观念之二:降低期望于心,提升目标于行

          为什么有很多人对自动化测试的可信任程度表示怀疑呢?这源于一句看似真理的废话:自动化不是用来发现缺陷的,而是为了验证系统改动是否造成关联影响并用以增加质量信心的。这话本意无非就是想告诉大家:不要对自动化测试的结果抱太高期望,对机器智能和人脑的差距要认清。这个本意本无可厚非,但是这句话现在却逐渐成了自动化测试低质量的借口了。

          首先,很多人认为自动化测试无法发现缺陷是因为测试脚本无法代替人类的自主思考,无法灵活变通。而我们之所以期望在测试执行时能够灵活变通,是因为测试分析设计时对被测应用设计细节的不确定性。非探索式的脚本化测试设计就是要通过输入精确的操作和数据类型,从而得到精确的输出来和预期结果进行对比,在这种模式下,没什么问题是需要变通才能被发现的。

          其次,不得不说自动化测试分析设计的难点在于对输入条件分支和状态机组合的穷举和选择上,这需要很大的成本。不幸的是,通常在做自动化测试分析设计时,我们习惯于用经验和主观感觉去做,不全面和主次不分的情况常常出现。因而,自动化测试分析和设计的不严谨、不完整也是自动化测试不能被信任的原因之一。      

          此外,自动化在那些已覆盖的测试上面表现的也不尽如人意,笔者观察到,大多数人并不是用自动化测试脚本去做测试或质量守护工作,而只是用来让他们运行通过,以获得KPI的达成和成就感。自动化测试运行失败,不习惯于或不乐于使用它的同事就会很轻易忽略潜在的问题,所以漏测和封版延期是常有的事。

          最后打个比方,自动化测试就像是看门的狗,没有它,家里进贼未必发现不了,关键是发现的时候是否还来得及挽回损失,而狗狗能不能在有贼光顾的时候示警,取决于我们如何驯养它。我们期望家里进贼的时候狗狗能够示警,但并不会期望它能够帮我们直接把小贼擒住;而且并非每次狗狗示警都意味着有贼入室,也有可能是阁下经过而已。自动化测试与此类似,凡其所致,但有一点不一致便会得到失败的结果,而至于是不是发现了虫子却又是另外一码事,想用自动化帮你解决所有问题,那你还是洗洗睡吧。

          总之,我们对自动化测试有什么样的期望,就应该有什么样的目标和要求;设定了什么层次的测试目标,就应该有什么样的使用效果。如果告诉你自动化测试可以朝着任意品种的狗狗去培养,目标就是看家护院,你非要以哈士奇食量大喂不起为由非要选小泰迪,那能有什么办法呢?如果自动化测试分析设计不严谨,而已覆盖的脚本也没有严格编写,而或脚本严格编写却并未善加利用,那么自动化测试自然就是一个彻底的谎言了。

    我们可以期望用自动化测试来暴露所有的问题供使用者抉择,而非用来精确定位每一个问题。即便我们不期望自动化测试发现所有的BUG,但是我们必须要用发现每一个BUG的标准去分析设计和利用我们的自动化测试用例。

    方法之一:善用手动测试用例库

          如果有完整或近乎完整的手动测试用例库,在做自动化测试的时候用它来甄别自动化测试范围、做自动化测试需求分析和设计是非常棒的,可达事半功倍之效。因为除了SLA签订的关键功能清单,我们可以分析测试用例库中最近X个月、Y个版本中被执行的测试用例的频率和比例等等数字,从而很容易得出最有价值做自动化测试的范围,而如有其他因素也可以加入综合评估。这时候,关联或映射手动测试用例和自动化测试脚本可以很容易地衡量自动化测试的覆盖率等相关指标。

          除此之外,手动测试用例之于自动化测试开发的意义还在于一种特定模式下的自动化测试开发:测试人员按照一种特定的规约编写产品或项目的手动测试用例,随后用一种模型化的转换规则去生成自动化测试脚本,继而再去修改和优化。这种模式的好处是,自动化测试脚本的开发者不需要懂业务知识,只需要按照业务测试人员编写的详尽的测试用例去实施。而不足之处却也十分明显,由于思维方式上的差异,编写测试脚本过程中的沟通成本不会太低,而且对建模水平要求很高。

    方法之二:搭建适应性强的框架

          开源测试工具,我们组先后用过Selenium RC、WebDriver、WatiJ这几种工具模式,框架采用JUnit和TestNG,测试调度和CI使用Jenkins管理。做起来最大的感受就是,像WebDriver这种工具,它本质上是为互联网而生;如果要用于我们的企业ERP应用的自动化测试,如果没有做一系列适应性的API和组件封装,测试脚本开发对于大部分同事来说都是件头疼的事情。

          经过摸索,我们结合PAFA(PingAn Foundation Architecture)架构的前端页面特征做了对象识别、页面加载和处理缓冲、运行监听、数据处理、断言和运行容错、报告、日志以及第三方组件(如Autoit、Cmd等)兼容的封装操作。这种封装属于Bot-Style,适用于我们基于业务操作驱动的自动化测试用例编写,能够大大地降低我们测试脚本开发的技术成本。虽然它们看起来运行起来效率并不是十分高,但是对于被测应用的响应速度来说已经是数十倍的效率胜出了。至于使用Page Object还是Bot-Style,还请大师们不要吐我的槽,这没什么可争论的,因为这只是面向前端业务操作的页面测试,二者的表现毫无优劣之分,完全在于队员的测试脚本编写风格偏好。

    附图1:测试中的TestCase样例

    附图2:测试中的TestApi样例

          我们正在从瀑布开发模式下逐渐开展持续集成和敏捷转型,不难预见,达到一定成熟度之后我们大部分团队会使用ATDD或BDD模式。这种快速开发的基于前端的自动化验证测试虽然在验证测试中所占的比例会越来越小,但它们将依然有用武之地,同时对当下的系统前端的回归测试也可以完全支持。

          自动化测试框架强大与否主要在于其适应性,所以与其说自动化测试框架是选择出来的,不如说它是被改造出来的。产品比较单一的小公司或者开发框架比较成熟的公司用一个工具、一个框架在一个测试平台下就可以解决一个公司的自动化测试实施的绝大多数问题,而大型企业的应用繁多复杂,很难由一个简单工具或者框架来解决。

    自动化测试框架,没有自己DIY过的永远都不要相信不造轮子这种说法,因为只有在你做的时候,你才能够更深入地理解你的工具、框架和你的被测应用及其所依赖的开发框架的特征,才会产出更具适应性的测试框架和特征库。

    方法之三:善用设计与重构

          无论是前端自动化测试还是单元测试,脚本代码结构的重要性是个老生长谈,因为这关乎测试脚本代码的可读性、维护经济性等问题。由于我们的业务系统的测试案例主要是基于操作流程的业务场景,所以我简单说一下我们在这方面的做法与经验,而单个功能点特性的测试分析也基本与此类同,不再独占篇幅。

    测试范围与设计

          大型企业,尤其是金融行业的ERP应用,很多系统实际上都是规则零散、流程复杂,规则引擎应用得并不是很充分。这便是前文所提及的自动化测试分析设计时对输入条件分支和状态机组合的穷举和选择困难的问题的产生原因了。对于这种情况,我们可以借鉴两个基础的测试设计方法:正交覆盖和Pairwise/All-Pairs,其基本原理和用法这里不再赘述。

          以正交覆盖为例,我们需要把影响流程分支走向的因子罗列出来。一般理论认为,缺陷的产生绝大多数是因为2个因素组合产生的,所以我们先做一个正交强度为2的配对来确认最小的测试组合范围。然后将正交强度变为最大,得到一个最大的测试组合范围,重新审视强度为2时的子集之外的其他案例是否有必测的理由。注:正交强度最大的组合结果集并不是简单的笛卡尔乘积,因为组合条件之间可能存在一些逻辑限制;此外,鉴于篇幅有限,本文就不再罗列下表最终正交得出的测试组合结果。


    图3:保险业务操作伪场景分析正交表样例

          通过对前端业务操作流程的分析,可以建立完整的前端的测试用例库,当然,前端的自动化测试可能只会选择其中的一部分去做,如上文所述,自动化测试覆盖率也可以很轻易地度量出来。在设计评审过程中,流程设计完成者需要向评审人员展示各个业务流程的测试组合结果,并且解释通过怎样的组合方法得到这些结果;进一步阐述依据什么样的原则得出自动化测试范围的选择结果。

    特性组件抽取

          完成了对测试案例场景的界定,我们便已明确我们要在被测应用上做什么样的操作,接下来的工作就是一些通用的简易特性抽取。虽然很多人声称复用不是个好东西,但它在编写测试脚本中适度的使用,却也可以很好地减少测试脚本开发和维护成本。

          第一层的特性抽取可以通过测试框架和工具来完成,简易的二次封装是保证测试书写低复杂度和保证测试脚本健壮性的好办法,就如同图中对click方法的简单封装一样。这件事情只需要一个像笔者一样略微熟悉测试工具和被测应用特性的测试工程师即可完成。所以这个活动的成本不会太高,而带来的效益却还是很不错的,至少可以给不熟悉测试工具的脚本开发者一段很长的学习缓冲期。


    图4:STAR测试框架中的Api样例

          接下来就是被测对象的共有特性组件做抽取,仍以前端自动化测试脚本开发为例,我们可以参照被测应用本身的组件复用规律来提取测试脚本中的公用页面组件。例如,图3所涉及的保全操作流程中,至少包含保全申请发起、质检、核保这三个可公用的页面组件。假如最终需要测试的场景案例有8个,其中5个必须质检、4个必须人工核保,那么在这三个点上就可以节省14(8+5+4-3)个测试Api的维护和开发成本。

          共有特性组件既不能设计的过于粗糙,从而造成在不同的自动化测试脚本中无法统一支持;又不能过度抽象,进而导致可读和可维护性变差。目标很简单:任意一处纯前端页面的改动,我们只需要修改一个测试Api;任意一个分支场景的规则改动,我们只需要修改一个测试案例脚本的数据和验证方法。

      脚本重构与舍弃

          虽然测试脚本应该被良好地规划设计,但实际执行的时候可能会遇到一些问题,比如在识别公用特性组建时存在遗漏却未在评审环节被发现,抑或被测应用的代码重构甚至是流程再造同样会要求我们去做这些对应的测试脚本重构的工作。

          我每天都会从SVN上checkout我们组17个工程的测试脚本,之前经常会发现某些系统一次性update十数个甚至数十个文件。这时候我会问一声为什么,最初得到的答复都是由于系统页面发生变动,所以这部分测试脚本都需要同步修改。我的回复一律都是:重构,重新做公用组件抽取,立刻做,因为我们耗不起这个维护成本!几次之后,再遇到这种情况,得到的答复便基本上都是:因为XX的变更影响了一些模块的测试脚本,所以我重构了一下。这时候我的心里就比较嗨皮,比较有成就感了,因此我也乐于不断地给大家灌输这种从别处学来的理念,而测试脚本重构的动力也从单纯的前端页面变更驱动变得更加多样化。

          伴随着测试脚本的开发,债务不可避免的在不断产生,如果不加以管控,终有一天我们都会由于对之无法负担而崩溃。所以我们如果真的重视自动化测试,我们就需要不断地优化我们测试脚本的结构,让它始终停留在我们可以控制的范围之内。必要的时候我们可以放弃一些已经开发完成的但是优先级稍低的测试脚本,即便它们运行得很好。在负担能力满载的情况下,以放弃低优先级的部分为代价来换回我们对测试资产持续优化和维护的能力、换回我们对这种低端技术债务的负担能力,始终都比承担不可控甚至崩溃的风险要来得更加有价值。

    方法之四:坚持定期脚本审查

          在团队里面推广自动化测试应用,同样也会存在很多沟通和理解上的误差,加之不是所有人的技能都在一个层次上,所以大家可能对测试脚本开发的各种要求的理解上都会存在不同的误区。因此,测试脚本开发完成之后第一时间要进行审查,这是测试脚本有效性验证的第一道关,虽然这个活动将耗费不少时间。

          测试脚本审查的手段分两种:工具检查和评审会议。一般建议在召开评审会议之前使用代码扫描工具如sonar或者checkstyle、 findbugs等,定义一些通用的规则去检查测试脚本书写和设计结构上的问题。使用工具的方法本文不介绍,完成这些基础不合规项的检查和修复之后则可以开始后续的测试有效性评审。测试有效性评审是个技术活也是个体力活,不仅需要很强大的业务知识支撑和对系统设计模式甚至架构的理解,同时也需要足够的时间和耐心来从事这项活动。接下来,简单说一些实际的检查点,通过这些检查点,我们将识别一段测试脚本是否能够达成测试目标,是否经济合理。

    •   经过设计评审的每一个案例是否都已经完成开发,是否存在额外的新增覆盖,为什么;
    •   预设的公用组件是否已经完全抽离实现,对于假设的被测应用修改,能否用最简单、最经济的测试脚本修改来支持同步;
    •   测试数据的初始化和使用是否合理,是否会破坏测试环境中数据的健康度甚至带来环境故障;
    •   测试的验证点是否精准足够,是否存在反向的验证方式(如,只检查是否有错误发生);
    •   测试脚本中是否存在多余的结构体,是否存在非预设的随机性分支;
    •   ……

          子曰:脚本三月不复查,CI即便全蓝——虫子照样遍地爬!自动化的测试有效性本就是需要通过维护去保持的,定期重新审查本就是一种测试脚本的维护手段,是非常有必要的。而频率则需要结合团队对测试脚本维护的力度来看,复审的主要的方法与开发完成之后的初次审查是一样的,只是关注点会稍有不同。

    两句废话做总结

          自动化测试是达成目标的工具手段还是负担,关键在于它对我们产生了什么样的影响,要产生好的效用,就必须保证其测试有效性。保证自动化测试有效性的手段很多,笔者目前的水平只能说到这里,但愿对入门者和彷徨者有所助益,高手和喷子们便一笑而过便可。

    作者简介

          刘毅,2006年毕业于电子科大应用数学学院,理学学士学位。毕业之后侥幸进入神州数码融信软件西安开发基地测试中心,2007年侥幸进入平安集团信息管理中心系统运营二部;现就职于平安科技系统开发四部,任系统测试工程师,参与养老险和健康险业务系统的建设和维护。熟悉保险核心业务系统和部分银行核心业务知识,偏擅前端自动化测试相关方法的应用、系统性能分析、简易性能调优和容量规划,知识杂泛,擅而不精。前后混迹于软件测试工作一线7年,提倡并践行在公司现有的优秀平台下,以问题解决驱动工作,以工作驱动学习的理念。

          新浪微博:@槽神刘叫兽
    展开全文
  • Java实现 蓝桥杯VIP 算法提高 传染病控制

    万次阅读 多人点赞 2019-06-22 12:10:27
    算法提高 传染病控制 时间限制:1.0s 内存限制:512.0MB 问题描述  近来,一种新的传染病肆虐全球。蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延。不幸的是...

    算法提高 传染病控制
    时间限制:1.0s 内存限制:512.0MB
    问题描述
      近来,一种新的传染病肆虐全球。蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延。不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群。于是,蓬莱国的疾病控制中心决定采取切断传播途径的方法控制疾病传播。经过 WHO(世界卫生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究消楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法。
    问题描述
      研究表明,这种传染病的传播具有两种很特殊的性质;
      第一是它的传播途径是树型的,一个人X只可能被某个特定的人Y感染,只要Y不得病,或者是XY之间的传播途径被切断,则X就不会得病。
      第二是,这种疾病的传播有周期性,在一个疾病传播周期之内,传染病将只会感染一代患者,而不会再传播给下一代。
      这些性质大大减轻了蓬莱国疾病防控的压力,并且他们已经得到了国内部分易感人群的潜在传播途径图(一棵树)。但是,麻烦还没有结束。由于蓬莱国疾控中心人手不够,同时也缺乏强大的技术,以致他们在一个疾病传播周期内,只能设法切断一条传播途径,而没有被控制的传播途径就会引起更多的易感人群被感染(也就是与当前已经被感染的人有传播途径相连,且连接途径没有被切断的人群)。当不可能有健康人被感染时,疾病就中止传播。所以,蓬莱国疾控中心要制定出一个切断传播途径的顺序,以使尽量少的人被感染。你的程序要针对给定的树,找出合适的切断顺序。
    输入格式
      输入格式的第一行是两个整数n(1≤n≤300)和p。接下来p行,每一行有两个整数i和j,表示节点i和j间有边相连(意即,第i人和第j人之间有传播途径相连,注意:可能是i到j也可能是j到i)。其中节点1是已经被感染的患者。
      对于给定的输入数据,如果不切断任何传播途径,则所有人都会感染。
    输出格式
      只有一行,输出总共被感染的人数。
    样例输入
    7 6
    1 2
    1 3
    2 4
    2 5
    3 6
    7 3
    样例输出
    3

    import java.util.Scanner;
    
    public class Main {
    	private static int d[],min=Integer.MAX_VALUE,yn[];
    	private Node head[],temp[];
    	
    	public void setHead(int n) {
    		this.head = new Node[n];
    	}
    
    	public void setTemp(int n) {
    		this.temp = new Node[n];
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner sc=new Scanner(System.in);
    		int n,m,i,x,y,a[];
    		Node t;
    		n=Integer.parseInt(sc.next());
    		m=Integer.parseInt(sc.next());
    		Main idc=new Main();
    		idc.setHead(n);idc.setTemp(n);
    		d=new int[n];
    		yn=new int[n];
    		for(i=0;i<n;i++)
    		{
    			idc.head[i]=idc.new Node();
    			idc.temp[i]=idc.head[i];
    		}
    		for(i=0;i<m;i++)
    		{
    			x=Integer.parseInt(sc.next())-1;
    			y=Integer.parseInt(sc.next())-1;
    			d[x]++;d[y]++;
    			t=idc.new Node();t.n=y;
    			idc.temp[x].next=t;idc.temp[x]=t;
    			t=idc.new Node();t.n=x;
    			idc.temp[y].next=t;idc.temp[y]=t;
    		}
    		d[0]++;
    		for(i=0;i<n;i++)d[i]--;
    		yn[0]=1;
    		a=new int[1];
    		chuanran(a,idc,1);
    		System.out.println(min);
    	}
    
    	private static void chuanran(int[] a, Main idc, int num) {
    		// TODO Auto-generated method stub
    		int n=a.length,i,newn=num,na[],t,m,j;
    		Node te;
    		for(i=0;i<n;i++)if(a[i]!=-1)newn+=d[a[i]];
    		if(newn==num)
    		{
    			if(newn<min)min=newn;
    			return;
    		}
    		newn--;
    		if(newn>min)return;
    		else
    		{
    			m=newn-num+1;
    			na=new int[m];
    			for(i=0,j=0;i<n;i++)
    			{
    				if(a[i]!=-1)
    				{
    					for(te=idc.head[a[i]].next;te!=null;te=te.next)
    					{
    						if(yn[te.n]==1)continue;
    						else
    						{
    							na[j]=te.n;j++;
    							yn[te.n]=1;
    						}
    					}
    				}
    			}
    			for(i=0;i<m;i++)
    			{
    				t=na[i];
    				na[i]=-1;
    				chuanran(na, idc, newn);
    				na[i]=t;
    			}
    			for(i=0;i<m;i++)yn[na[i]]=0;
    			return;
    		}
    	}
    
    	class Node{
    		int n;
    		Node next;
    	}
    }
    
    
    
    展开全文
  • 提高系统可靠 。 航空领域的飞机,因为单次飞机事故造成的死亡率高,死亡人数多,所以冗余系统在飞机上也有很好的应用,如果一个飞机需要两个发动机可以正常启用的话,那这个飞机可能需要至少四个发动机,除去...

    中国人德国人美国人日本人四个人坐飞机,飞机有四个发动机,结果,飞机出了故障,坏了一个发动机,需要紧急减轻重量,有一个人要跳下去,否则飞机就会坠毁。

    于是他们决定石头剪刀布,输了跳下去。 美国人输了,美国人走到舱门口说:“美利坚合众国万岁!”,就跳下去了。

    没多久,又坏了一个发动机。德国人输了。德国人走到舱门口说:“德意志万岁!”,就跳下去了。

    又没多久,又坏了一个发动机。中国人输了。中国人大吼一声:“中国人民万岁!”然后,就把那日本人从舱门口踹了下去。

    这是一个笑话。但是呢,笑完之后,发动机如果做了备份,飞机如果有一个发动机损坏了,仍然还可以飞行。这个就是冗余设计。

    一、什么是冗余设计

    又称余度设计技术,是在系统或设备完成任务起关键作用的地方,增加一套以上完成相同功能的功能通道、工作元件或部件,以保证当该部分出现故障时,系统或设备仍能正常工作,以减少系统或者设备的故障概率,提高系统可靠性

    航空领域的飞机,因为单次飞机事故造成的死亡率高,死亡人数多,所以冗余系统在飞机上也有很好的应用,如果一个飞机需要两个发动机可以正常启用的话,那这个飞机可能需要至少四个发动机,除去安全系数的考虑外,这里面就有冗余系统的理念,以保证一两个发动机的故障,不会引起飞机失事,而造成重大的事故。这里可以看出冗余系统的一个很重要的缺点:就是发动机的故障并不是独立的,可能其中一个发动机着火的话,会引起其他发动机的故障,所以这个可靠性会比理论计算的少很多。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    生活中,也有比较常见的冗余系统,如运货的重卡,在卡车载重的后轮胎上,任意一个轴承上的一边至少有两个轮胎,其实仅需要一个轮胎,重卡就可以正常运行,另外一个轮胎就是冗余系统了。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    冗余系统不一定非要是软件类的系统或机械类的设备,也可以是人(广义上来说人也是系统的一部分),但用人来当冗余系统的话,可靠性会更低,因为人的判断更易受外界因素的干扰。

    一般来说冗余系统目的在于:为了保险起见,采取两套同样独立配置的硬件、软件或设计等,防止在其中一套系统出现故障时,另一套系统能立即启动,代替工作,这就好比演员的替身。一套单独的系统也许运行的故障率很高,但采取冗余措施后,在不改变内部设计的情况下,这套系统的可靠性立即可以大幅度提高。假如单独系统的故障率为50%,而采取冗余系统后马上可以将故障率降低到25%。

    冗余系统的优点在于:

    一、以现有的系统为依托,不需要任何时间或科研投入,可以立即实现;

    二、配置、安装、使用简单,无需额外的培训、设计等;

    三、使用冗余系统,理论上来讲,系统的故障率可以接近为零。

    冗余系统的缺点在于:

    一、使用冗余系统就代表该系统臃肿,不简洁;

    二:投入成本巨大,需要购买额外的系统,以及增加该系统后的后期维护成本等;

    三:完全独立的系统并不存在,所以冗余系统最大的缺点在于,相互独立的配置之间会互相影响(尤其是依靠人的冗余系统),可靠性相对理论计算会大幅度下降。

    冗余系统因为前期投入巨大,后期的维护成本高,所以只有在高风险(包括金融风险、行政风险、管理风险以及危及生命安全的风险)行业应用比较广泛,如:金融领域、核安全领域、航空领域、煤矿等领域。

    银行中的数据非常重要,即使服务器小概率的故障,也会有很大影响,甚至会影响一个国家的金融体系的稳定。所以,每一个银行的数据至少同时存在两个以上的不同地点的服务器中(这就是一个简单的冗余系统),需要明白的是这个跟备份不一样,备份可以是先存储,再备份,而银行系统的冗余系统是同时更改,以保证在任意时间,任意一个服务器的故障,都不会引起数据失真。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    二、冗余设计的分类

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    1、异地容灾:

    异地容灾,顾名思义就是在不同的地域,构建一套或者多套相同的应用或者数据库,起到灾难后立刻接管的作用。

    现代的企业已经变得越来越依赖数据处理中心进行业务处理,对于这些数据中心来说,业务完全依靠信息技术进行处理。对于信息处理中心来说,对数据的完整性和可用性提出了极高的要求。特别是大型金融、电信等企业,对业务系统的连续性提出了更高的要求,对于这些企事业单位来说,遇到突发的故障事件,没有完备的灾备系统,对于业务系统都是致命的。同样,对许多中小企业来说,必要的灾备系统也是必要的。提高可靠性最笨的办法,也是最有效的方法——冗余设计

    由于异地容灾的解决方案,是两套或者多套数据及设备部署在不同的地域,所以当一个地点发生火灾、地震的情况的时候,在异地的备份可以接管业务。由于平时两地的数据同步,也不会造成用户数据丢失。

    2、双机备份

    双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。而双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)。

    在企业的发展情况与不同环境因素下,用户对系统的连续工作性和实时性也有着更高的要求,从实际操作面来看,企业用户在工作环节中,要把采集到的实时数据存储在两台计算机上,其中一台采集机故障时,另一台备用的立刻可以接替,并给出警告信号,当采集机恢复后,可自动接替备用机。因此既达到能保存重要数据,又能节省成本,那么双机备份软件就是企业用户的更好选择。

    基于共享存储(磁盘阵列)的方式

    共享存储方式主要通过磁盘阵列提供切换后,对数据完整性和连续性的保障。用户数据一般会放在磁盘阵列上,当主机宕机后,备机继续从磁盘阵列上取得原有数据。如下图所示

    提高可靠性最笨的办法,也是最有效的方法——冗余设计传统的单存储方式

    这种方式因为使用一台存储设备,往往被业内人士称为磁盘单点故障。但一般来讲存储的安全性较高。所以如果忽略存储设备故障的情况下,这种方式也是业内采用最多的热备方式。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    全冗余方式

    全冗余方式就是双机双存储,基于单台存储的传统双机热备方式,确实存在存储单点故障的情况,为实现存储冗余,存储高可用也已经越来越多的被用户接受。我们从理解上可以看出,双机热备最早是为解决服务器的计划性停机与非计划性宕机的解决方案,但是我们无法实现存储的计划性停机与非计划性宕机带来的服务器停机,而存储作为双机热备中唯一存储数据的设备,它一旦发生故障往往会造成双机热备系统全面崩溃。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    3、单板级主备倒换

    高端设备由于所处网络位置非常重要,不允许出现单点故障,设备一般都配备两块主控板,分别称为主用主控板(Master)和备用主控板(Slave)。其中,主用主控板作为控制平面的核心,与外部和业务板进行业务通信,完成系统内各模块的正常功能;而备用主控板则只作为主用主控板的备份,与外部和业务板没有通信。当主用主控板发生故障时,系统自动进行主备切换,由备用主控板接替主用主控板的工作,保证业务的正常运行

    主备主控板的热备份过程主要分为批量备份、实时备份和数据平滑三个阶段。

    备用主控板启动后,由于此时主用主控板和备用主控板的差异比较大,主用主控板会将当前需要备份的数据批量同步到备用主控板,这个过程称之为批量备份,批量备份时间的长短取决于需要备份数据量的大小。

    批量备份过程结束后,系统进入实时备份过程,在此过程中,当主用主控板备份数据发生变化时,备份数据将实时同步到备用板,这个过程通常很快。

    主备倒换后,备用板升为新的主用板,会通知各个模块向业务板进行数据收集和同步,这个过程称之为数据平滑。平滑过程中,各模块主动与业务板进行通信,在硬件状态、链路层状态、配置数据三个方面进行确认和同步,以保证整个系统维护的数据和状态是一致的,从而确保主备切换之后,系统能够正常运行。平滑阶段结束,新的主用板才称之为完全意义上的主用主控板。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    上面的机框,可以看出,电源板、主控板都做了备份两份的配置。

    4、单板资源池

    再如上图中,下面这些电路板一般都是业务或者是接口板,为了防止有单板损坏,按照业务性能满足之外,一般会多备份一块备用电路,如果有正在工作的某一块电路损坏,都可以切换到备用电路板,进行继续工作。

    5、磁盘阵列

    即然提到了RAID磁盘阵列,那么我们就先来了解一下什么是RAID?所谓的RAID,是Redundant Arrays of Independent Disks的简称,中文为廉价冗余磁盘阵列。由1987年由加州大学伯克利分校提出的,初衷是为了将较廉价的多个小磁盘进行组合来替代价格昂贵的大容量磁盘,希望单个磁盘损坏后不会影响到其它磁盘的继续使用,使数据更加的安全。RAID作为一种廉价的磁盘冗余阵列,能够提供一个独立的大型存储设备解决方案。在提高硬盘容量的同时,还能够充分提高硬盘的速度,使数据更加安全,更加易于磁盘的管理。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    RAID的几种常见工作模式

    1、RAID 0

    RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术。RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID 0没有提供冗余或错误修复能力,是实现成本是最低的。

    RAID 0最简单的实现方式就是把N块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起创建一个大的卷集。在使用中电脑数据依次写入到各块硬盘中,它的最大优点就是可以整倍的提高硬盘的容量。如使用了三块80GB的硬盘组建成RAID 0模式,那么磁盘容量就会是240GB。其速度方面,各单独一块硬盘的速度完全相同。最大的缺点在于任何一块硬盘出现故障,整个系统将会受到破坏,可靠性仅为单独一块硬盘的1/N。

    为了解决这一问题,便出一了RAID 0的另一种模式。即在N块硬盘上选择合理的带区来创建带区集。其原理就是将原先顺序写入的数据被分散到所有的四块硬盘中同时进行读写。四块硬盘的并行操作使同一时间内磁盘读写的速度提升了4倍。

    在创建带区集时,合理的选择带区的大小非常重要。如果带区过大,可能一块磁盘上的带区空间就可以满足大部分的I/O操作,使数据的读写仍然只局限在少数的一、两块硬盘上,不能充分的发挥出并行操作的优势。另一方面,如果带区过小,任何I/O指令都可能引发大量的读写操作,占用过多的控制器总线带宽。因此,在创建带区集时,我们应当根据实际应用的需要,慎重的选择带区的大小。

    带区集虽然可以把数据均匀的分配到所有的磁盘上进行读写。但如果我们把所有的硬盘都连接到一个控制器上的话,可能会带来潜在的危害。这是因为当我们频繁进行读写操作时,很容易使控制器或总线的负荷 超载。为了避免出现上述问题,建议用户可以使用多个磁盘控制器。最好解决方法还是为每一块硬盘都配备一个专门的磁盘控制器。

    虽然RAID 0可以提供更多的空间和更好的性能,但是整个系统是非常不可靠的,如果出现故障,无法进行任何补救。所以,RAID 0一般只是在那些对数据安全性要求不高的情况下才被人们使用。

    2 RAID 1

    RAID 1称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块硬盘失效时,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,具备很好的磁盘冗余能力。虽然这样对数据来讲绝对安全,但是成本也会明显增加,磁盘利用率为50%,以四块80GB容量的硬盘来讲,可利用的磁盘空间仅为160GB。另外,出现硬盘故障的RAID系统不再可靠,应当及时的更换损坏的硬盘,否则剩余的镜像盘也出现问题,那么整个系统就会崩溃。更换新盘后原有数据会需要很长时间同步镜像,外界对数据的访问不会受到影响,只是这时整个系统的性能有所下降。因此,RAID 1多用在保存关键性的重要数据的场合。

    RAID 1主要是通过二次读写实现磁盘镜像,所以磁盘控制器的负载也相当大,尤其是在需要频繁写入数据的环境中。为了避免出现性能瓶颈,使用多个磁盘控制器就显得很有必要。

    3 RAID0+1

    从RAID 0+1名称上我们便可以看出是RAID0与RAID1的结合体。在我们单独使用RAID 1也会出现类似单独使用RAID 0那样的问题,即在同一时间内只能向一块磁盘写入数据,不能充分利用所有的资源。为了解决这一问题,我们可以在磁盘镜像中建立带区集。因为这种配置方式综合了带区集和镜像的优势,所以被称为RAID 0+1。把RAID0和RAID1技术结合起来,数据除分布在多个盘上外,每个盘都有其物理镜像盘,提供全冗余能力,允许一个以下磁盘故障,而不影响数据可用性,并具有快速读/写能力。RAID0+1要在磁盘镜像中建立带区集至少4个硬盘。

    由于我们此次只是介绍家用台式机如何组建RAID磁盘阵列功能,目前主流的主板也只是提供这三种组建模式,因此其它诸如服务等的高级RAID模式,这里我们将不再过多的介绍。

    4、RAID 5

    RAID 5控制还是比较常用的。RAID 5和RAID4 相似但避免了RAID4 的瓶颈,方法是不用校验磁盘而将校验数据以循环的方式放在每一个磁盘中,RAID 5控制比较复杂,尤其是利用硬件对磁盘阵列的控制,因为这种方式的应用比其他的RAID level 要掌握更多的事情,有更多的输出/入需求,既要速度快,又要处理数据,计算校验值,做错误校正等,所以价格较高。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    RAID 5在不停机及容错的表现都很好,但如有磁盘故障,对性能的影响较大,大容量的快取内存有助于维持性能,但在OLTP 的应用上,因为每一笔数据或记录(record)都很小,对磁盘的存取频繁,故有一定程度的影响。

    某一磁盘故障时,读取该磁盘的数据需把共用同一校验值分段的所有数据及校验值读出来,再把故障磁盘的数据计算出来;写入时,除了要重覆读取的程序外,还要再做校验值的计算,然后写入更新的数据及校验值;等换上新的磁盘,系统要计算整个磁盘阵列的数据以回复故障磁盘的数据,时间要很长,如系统的工作负载很重的话,有很多输出/入的需求在排队等候时,会把系统的性能拉下来。

    但如使用硬件磁盘阵列的话,其性能就可以得到大幅度的改进,因为硬件磁盘阵列如Arena 系列本身有内置的CPU 与主机系统并行运作,所有存取磁盘的输出入工作都在磁盘阵列本身完成,不花费主机的时间,配合磁盘阵列的快取内存的使用,可以提高系统的整体性能,而优越的SCSI 控制更能增加数据的传输速率,即使在磁盘故障的情况下,主机系统的性能也不会有明显的降低。RAID 5要做的事情太多,所以价格较贵,不适于小系统,但如果是大系统使用大的磁盘阵列的话,RAID 5却是最便宜的方案。以上介绍RAID 5控制。

    三、冗余设计应用举例

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    上图,这是一个典型的通信设备的冗余备份设计。

    主控板、交换板、时钟板: 1+1热备或温备

    一次电源模块: 1:1并联双工

    风扇单元:负荷分担

    功能板、接口板:N+1备份

    我们都知道:一个和尚挑水喝、两个和尚抬水喝,三个和尚没水喝。如果资源多了,做不好协调和管理,会适得其反。

    我们做了冗余设计,如果以下几点没有做好,不但不能提高系统可靠性,还可能弄巧成拙。

    影响1+1冗余系统可靠性的关键因素:

    1、主、备用单元故障检测率

    2、切换成功率(与倒换电路、逻辑等相关)

    3、主、备用单元的失效率

    4、故障修复率

    5、数据备份模块负责通过一定的形式组织和管理需要备份的数据,在主备板之间建立备份通道,接收用户的备份通知,发送和接收备份数据,将主板中的数据备份到备板上。

    6、倒换模块负责单板状态监控和主备单板倒换的触发。执行相应的操作:主板降为备板复位、备板升为主板,并且触发平滑过程。倒换模块同时对数据备份模块进行控制,并在倒换后启动原备板的平滑过程。

    7、数据平滑模块负责倒换后备板对备份数据进行一致性检查以及数据重建的工作。

    提高可靠性最笨的办法,也是最有效的方法——冗余设计

    1、主备倒换

    高端交换机由于所处网络位置非常重要,不允许出现单点故障,设备一般都配备两块主控板,分别称为主用主控板(Master)和备用主控板(Slave)。

    其中,主用主控板作为控制平面的核心,与外部和业务板进行业务通信,完成系统内各模块的正常功能;而备用主控板则只作为主用主控板的备份,与外部和业务板没有通信。当主用主控板发生故障时,系统自动进行主备切换,由备用主控板接替主用主控板的工作,保证业务的正常运行

    2、数据备份

    3、主备工作状态机

    主用主控板状态机在如下五个状态顺序迁移,分别为:等待备用板插入状态、等待批量备份请求状态、批量备份状态、实时备份状态以及数据平滑状态。

    备用主控板状态则在就绪状态、批量接收数据状态、实时接收数据状态三个状态顺序迁移。

    主用板启动正常工作后就进入等待备用板插入状态;主用主控板检测到备用板插入槽位上电启动后进入到等待批量备份数据状态,等待备用板的批量备份数据请求;当备用板上电启动完毕后,首先会向主控板发送数据批量备份请求,主控板就把需要备份的数据打包批量发送给备用板,包括配置信息和一些状态信息等;批量备份完成后,进入实时备份状态,当主控板需要备份的数据发生变化时,会通过消息发送给备用板,备用板完成相关同步工作;平滑过程只有在备用板变为主控板的阶段才会出现,是主控板的控制平面数据和业务板进行状态确认和同步的过程;平滑过程完成后备用板才真正成为主控板。

    备用板上电启动完成后即进入就绪状态,即随时可以接替主控板工作的状态;然后向主控板发送批量数据备份请求,进行批量数据同步,此时不与业务板进行通信;批量同步完成后,进入实时备份状态,实时备份的发起者是主控板,备用板只有在接收到备份数据消息时才进行实时备份。

    4、主备状态确定及倒换

    4.1 主备状态确定

    双主控环境下,主控板的状态是主用还是备用,是在启动过程中由硬件决定的。一般情况,设备会首先选择小槽位号的主控板作为主用主控板(双主控启动环境下,硬件会在大槽位号主控板设置一个延时,使它稍后启动)。

    初始启动时,两块主控板都处于备用状态,各自进行软件的启动。小槽位号主控板在启动到一定阶段时将自己的单板状态位置为正常,并且同时检测另一块主控板的状态是否正常;而大槽位号的主控此时会有一个延时,再检查另一块主控板是否正常,并且将自己的单板状态位置为正常。这样,在小槽位号主控板的状态变为正常时,大槽位号主控板的状态还未正常,因此小槽位号主控板的状态为主用;大槽位号主控板在延时过后检查,发现另一块主控板的状态为正常,便将自己设置为备用状态。所以,在双主控环境下,即使在系统重启之前,是大槽位号主控板的状态为主用,重启后,仍然会是小槽位号主控板的状态为主用。

    4.2 主备倒换触发

    备用主控板到达实时接收数据状态后,如果检测到倒换通知,则切换为主用主控板。检测通知是中断触发的,主备倒换的硬件切换时间在毫秒级。硬件切换后,新主控板的主备状态机进入平滑状态,开始平滑过程处理。

    主备切换的触发因素主要有以下几类:

    命令行执行主备倒换命令,强行切换。

    主用主控板硬复位或者被手工拔出,引起主备倒换。

    主用主控板上发生软件异常重启,从而触发倒换。如:模块异常占用CPU时间过长,引发硬件看门狗重启系统;数据访问异常、指令访问异常等系统异常等引发重启。

    对于以上不同的触发因素,备用主控板感应的时间都是一样的:都是在硬件中断触发的,状态切换时间在毫秒级。

    主控板和备用板都会周期发送握手报文,主控板或备用板在设定的周期内没有收到对方的握手报文,就会认为主备通信异常,重新复位备用板。

    展开全文
  • 提高系统可靠的措施

    千次阅读 2019-04-24 16:56:18
    防止故障造成系统失效的两种技术是 故障掩蔽技术和系统重组技术 ,故障掩蔽技术是指 ...但联机备份比较复杂,需要对系统的核心有比较深刻的认识,对备份策略进行反复的测试,才能最终确定它的正确和可用
  • PID控制详解

    万次阅读 多人点赞 2018-12-16 10:43:04
    PID( Proportional Integral Derivative)控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒好和可靠高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。 在工程实际中,...
  • 如何提高软件可维护

    千次阅读 2011-09-30 20:20:43
    软件工程中把软件开发大概分了六步:可行分析、需求分析、设计、编码、测试、运行与维护,在这几大部分中,维护占有重要地位,一般我们不想把大分分精力、财力花费在维护上,这就需要我们提高软件的可维护
  • 经典提高培养情商最有效的13本书

    万次阅读 2016-12-12 17:04:34
    原文地址:经典提高培养情商最有效的13本书作者:好书10 TOP1 书名:《情商:为什么情商比智商更重要 》 PDF下载 TXT下载 在线阅读 点击购买 智商...
  • 永磁同步电机控制原理 矢量控制框图如下图所示: 矢量控制的原理是在永磁同步电机上设法模拟直流电动机的转矩控制规律,经过坐标变换,使其电流矢量分解为产生磁通的电流分量和产生转矩的电流分量,两个...
  • 在 Web 服务器做出响应时,为了提高安全,在 HTTP 响应头中可以使用的各种响应头字段。X-Frame-Options该响应头中用于控制是否在浏览器中显示 frame 或 iframe 中指定的页面,主要用来防止 Clickjacking (点击...
  • 如何提高软件可靠

    千次阅读 2008-08-07 11:43:00
    一、软件可靠定义 长期运行的稳定(鲁棒) 输出数据的正确 异常情况的可记录 二、影响软件可靠的因素 1) 需求分析定义错误 由于分析失误,从开始就走上了错误的路线,向着错误的目标前进,以后实现中的...
  • 一个阶段的学习结束了,整理了之前的过程中的学习成果,已经过了工作的年纪,在这里稍微出一下自己做的一套永磁同步电机的教程,从基础的矢量控制,到应用较强的MTPA、弱磁控制等,最后深入到无速度传感器的控制,...
  • 提高软件可靠的方法和技术

    万次阅读 2013-07-17 09:24:05
    提高软件可靠的方法和技术      1.建立以可靠为核心的质量标准  在软件项目规划和需求分析阶段就要建立以可靠为核心的质量标准。这个质量标准包括实现的功能、可靠、可维护、可移植、安全...
  • (1)校验和(2)面向连接(3)序号和确认序号(4)确认应答机制 (5)超时重传机制(6)流量控制 (7)拥塞避免TCP提高效率:(1)滑动窗口(2)快重传 (3)延迟应答(4)捎带应答TCP保证数据传输可靠1....
  • 因此BLE一般应用于低速率的近场控制和数据交互,如智能家电、运动手环等等,小数量的控制和交互对传输速度没有要求,每秒1K字节就可以了,有时为了功耗可能会更低。但在某些场景下,可能要求BLE尽可能提高传输速率,...
  • 有效值、真有效值、全有效值,采样准确问题

    万次阅读 多人点赞 2018-08-10 12:20:42
    ADC采样 真有效值计算问题 1.有效值、真有效值、全有效有效值主要用于衡量交流电压、交流电流的幅值大小,出发点是热效应与直流电相同。 1.1 电流电压有效值 电压/电流有效值:   在相同的电阻两端...
  • 基于PC的工业控制系统的优缺点分析

    万次阅读 2016-03-16 18:32:08
    过去一段时间,在工业控制领域形成有两个竞争阵线,有些说PC能很好地用于控制,而有些人说PC永远不适合用于工厂的环境。今天,这些竞争对手很容易接受PC机用于许多工业生产控制的现状,因为一个接一个的制造商已经在...
  • 如何提高工作激情,打造狼团队

    千次阅读 2017-12-12 18:10:50
    管理者摆一个擂台,让下属分别上台较量,能充分调动员工的积极、主动、创造和争先创优意识,全面地提高组织活力。 84、竞争能快速高效地激发士气 85、不妨偶尔在工作中打个赌 86、让员工永远处于竞争...
  • TCP - 流量控制 and 拥塞控制

    千次阅读 2015-09-22 14:31:19
    未完待续。。 流量控制 拥塞控制 ... 流量控制序言:数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制以免数据丢失。利用滑动窗口机制可以很方便的在TCP连接上实现
  • 模糊控制介绍

    千次阅读 2006-04-28 09:28:00
    模糊控制介绍一、模糊控制概况 模糊逻辑控制 (Fuzzy Logic Control)简称模糊控制(Fuzzy Control),是以模糊集合论、模糊语言变量和模糊逻辑推理为基础的一种计算机数字控制技术。1965年,美国的L.A.Zadeh创立了模糊...
  • 在我们的控制设计中考虑了外部干扰、控制输入非线性和模型不确定。基于离散时间域的动力学模型,两个神经网络(包括一个临界神经网络和一个作用神经网络)被集成到我们的自适应控制设计中。引入临界神经网络来评价...
  • 计算的本质,就是在信息的控制下,利用能量实现运算 算盘这种计算机的本质是什么呢? 就是利用人的能量,在珠算口诀这种信息集合的控制下,完成信息的处理。也就是说,计算机需要有能量才能工作,需要信息的控制...
  • 对第二个问题的解释在于,既然PID控制器运用已经如此广泛了,那么基于现代控制理论的现代控制系统就处于一个相对尴尬的境地,即应用有限的同时理论却在不断更新,这使自动化越来越像理科而不是工科,对于这种现象该...
  • 自动控制的基本概念一 . 自动控制系统的组成自动控制装置:自动控制装置的组成当中涉及到了这样这样一些东西: 第1,需要有被控对象,那么这些被控对象需要有谁来控制呢?一定要有控制器,这些控制器,我们也把它...
  • 一、静态指标术语 二、动态指标术语 三、步进电机加减速过程控制技术 四、步进电机的细分驱动控制 五、步进电机控制策略
  • hslogic_磁吸控制系统

    千次阅读 2020-09-21 00:30:24
    磁吸控制系统是学习和研究控制理论的重要平台之一。对磁吸系统的研究可以归结为对非线性系统和不稳定系统的研究,这类复杂控制对象难以用数学公式进行精确描述,采用经典控制方法也难取得好的控制效果。 本文在...
  • 这个题目不是很明确,而且这个文章比较长,也算是我的一个阶段总结,既然是总结,就不必为题目而纠结了。在端午假期的最后来做这个总结也实属不易(假期前两天加班,没有完成预期的计划,低落),记得很早以前写那篇...
  • 先进过程控制之一:浅说APC

    千次阅读 2019-02-23 12:57:16
    先进过程控制(APC)技术作为在生产装置级的信息化应用,在优化装置的控制水平和提高生产过程的管理水平的同时,还为企业创造了可观的经济效益。 1、什么是APC 先进过程控制,简称APC,并不是什么新概念。它仅仅...
  • 数据安全-访问控制

    千次阅读 2018-10-17 16:14:44
    数据安全-访问控制访问控制的应用场景访问控制的概念访问控制的三要素访问控制与身份认证的关系访问控制的类型自主访问控制强制访问控制常用安全模型-BLP安全模型(Bell-Lapadula security model)安全模型-BLP安全...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422,891
精华内容 169,156
关键字:

为了提高控制的有效性