BMW助记符用于查找边界值

目录内容



助记符是可以帮助我们记住某些事情的单词或短语。 最著名的助记符是“每个猎人都想知道山鸡坐在哪里”。 无论你问谁,每个人都认识她。

但是在专业领域,一切都有些悲惨。 询问您的同志是否知道SPDFOT或RCRCRC。 远非事实……但是助记符可以帮助我们运行测试,而不忘记检查最重要的内容。 清单一词折叠!

会说英语的测试同事经常使用助记符。 一个读外国博客的朋友说,美国人几乎每打喷嚏都会跟着他们。

我认为那很棒。 外来助记符可能并不特别适合您的系统或进程。 而且,亲爱的他会提醒您“不要等着检查这一点”,并限制生产中的错误数量。

今天,我想与大家分享我的宝马助记符,用于研究边界值。 可以是:

  • 初级进行测试设计的一般开发;
  • 在面试中使用-候选人通常解决“找到边界”的任务,但是他会在边界中找到边界还是下载文件?


宝马助记符


B-
M-
B-刚好

宝马-大,小,正好

很容易记住。 只要记住这辆酷车,马上就可以解密了! 但是,这是什么意思?它对面试有什么帮助?

刚好


刚好

原则上,“正当”是在没有助记符的情况下进行测试。 我们总是从肯定的测试开始,以验证系统是否正常工作。

如果该字段为数字,请输入公共值。 假设我们有一个零售在线商店。 在货物数量中,我们可以检查1或2。

正面测试-这是“正确的”。 我以鼠标的形式显示了助记符。 这是标准尺寸。

大的


然后,我们说鼠标必须膨胀到令人难以置信的大小,以便它不能直接适合图片。 并查看系统如何使用它。

大的

在这种情况下,我们只是“遥遥领先”。 非常远 大鼠标代表着对某个技术边界的搜索,该边界位于任意区域之外。

要输入货物数量,该字段将为“ 99999999999999999999999999999999999999999999999999999999 ...”。 不仅价值巨大(9999),而且非常巨大。 请记住,鼠标-炸得很厉害,甚至还没塞进照片。

区别很重要,非常重要将有助于找到任意边界,而巨大的边界将有助于找到技术边界。 通常对“大”进行测试,对于“大”进行测试-不。 助记符恰好回忆起他。

小号


我们刺穿鼠标,然后将其吹成微观尺寸。

小号

小鼠标用于搜索接近零的值。 最小正值。

如何测试“ 0.00000001”? 检查为零,但不要忘记并排挖掘。

那有什么?


似乎在说明显的话。 似乎每个人都已经知道这一点。 只需对一个数字任务,一个相同的三角形( 来自Myers任务 )进行采访,您就会了解并非如此……很少有人会去寻找技术边界或尝试输入接近零的分数。 最高为零,并将提供检查。

而且,如果您建议不测试数字,那么这将是一个更大的问题。 有了数字,好的,我们根据工作说明检查了零,并检查了边框,这已经不错了。 并在线测试什么? 并在文件中?

我想在文章中谈论这一点。 如何在现实生活中使用助记符,同时捕捉错误。 让我们从常见示例开始-在每个项目中都可以找到。 可以在面试中以一项小任务的形式给出。

然后,我将举例说明我的工作。 是的,它们是特定的。 是的,它们与特定技术有关。 那又怎样 但是它们显示了如何在更复杂的地方应用助记符。

含义是相同的:边界几乎无处不在。 只需找到数字并进行试验。 并且不要忘记BMW助记符,因为在B和M上我们经常遇到错误。

常见的例子


任何项目中的示例:数字字段,字符串,日期...我们将按以下顺序考虑:

  • 刚好
  • 大的
  • 小号

编号


  • 10
  • 0.00000001
  • 999999999999999999999999 ....

请说出装有书籍,衣服或果汁包数量的盒子。 作为一项阳性测试,我们选择一些适当的量:3、5、10。

作为一个较小的值,请选择尽可能接近零的值。 请记住,鼠标应该很小。 这不仅是一个单位,而且是小数点后第N位。 突然将其舍入为零,并且公式中的某处将崩溃? 此外,在数字“ 1”上,一切都会正常运行。

好吧,通过输入1000万个9可以达到最大值。 使用Perlclip之类的工具生成这样的字符串,然后继续进行非常多的测试!

另请参阅:
表示数字的字符串的等效类 -有关数字字符串测试的更多建议
如何产生大串,工具 -产生巨大价值的助手

日期


  • 2017/05/26
  • 1900年1月1日
  • 12/21/003

如果我们在某个日期发送报告,则正日期可以是“今天”。 或者,您的生日(如果我们谈论的是灾难恢复),或者其他适合您业务流程的日期。

作为一个小日期,我们将魔术日期定为“ 01/01/1900”,在该日期上应用程序经常崩溃。 从此日期开始,时间在Excel中开始。 它还潜入了应用程序。 您暴露了这个魔幻数字-即使存在防止傻瓜为零的保护措施,报告也会崩溃。 因此,我强烈建议您进行验证。

如果我们谈论的是非常小的鼠标,那么您仍然可以选中“ 00.00.0000”。 这将是零检查,这也很重要。 但是,从1900年1月1日开始,开发人员更容易受到保护。

遥遥领先也可以有所不同。 您可以输入负数并检查确实不存在的日期或月份:05/40/2018。 或使用日期99.99.9999搜索技术前沿。 而且您可以得到更多的实际价值,而这不会很快出现:2400或3000。

另请参阅:
表示日期的字符串的等效类 -有关测试日期的更多建议

测试日期

弦乐


  • 瓦西亚
  • (一个空格)
  • (有很多文字)

假设在注册时有一个带有名称的字段。 阳性测试是一个通用名称:Olga,Vasya,Peter ...

当寻找一只小老鼠时,我们会空行或抢劫:一个或两个空格。 在这种情况下,该行保持为空(那里没有字符),但似乎已被填充。

寻找大鼠标时的重点是什么? 测试大字符串时,我们需要测试BIG字符串! 回想一下鼠标应该很大。 因为我通常会向学生解释这一切如何工作,如何寻找技术前沿等。 然后他们给我DZ并写上“我检查了1000个字符-没有技术界限。”

在21世纪的院子里,什么是1000个字符? 我们采用任何能够产生1000万并插入1000万的工具,现在这将是在寻求技术边界。 并且已经存在一些错误,系统可能会因此中断。 但是1000个字符? 不行

另请参阅:
如何产生大串,工具 -产生巨大价值的助手

但是好吧,这里的一切也都清楚了。 如果我们测试文件会怎样?

档案文件


在哪里可以找到文件中的数字?

首先,文件具有其大小:

  • 5兆
  • 1 kb
  • 10 GB

测试大型文件时,他们通常会尝试30Mb之类的东西,对此他们会冷静下来。 然后您加载1GB-就是这样,服务器冻结了。

当然,如果您是初学者并测试一些真实的网站的经验,则不应在所有者不知情的情况下加载它。 但是,当您在工作中进行测试时,请务必检查大鼠标。

其次,文件的名称为→,这是我们刚刚讨论的行的长度。

但是文件也有它的内容! 有许多列(列)和行。 线路测试:

  • 5线
  • 1排
  • 1,000,000,000行

从这里开始乐趣。 因为即使在同一Excel中的不同版本中,对其支持的行数也有不同的限制:

  • 低于97-16384的Excel
  • Excel 97-2003-65536
  • Excel 2007-1,048,576

但是数量仍然很大,这并不有趣。 但是,旧的exel在列中的打开数量不超过256个,这是一个严重的限制:

  • Excel 2003-256
  • Excel 2007-16,385

他的自由兄弟LibreOffice不能打开超过1024列。

你在说谎,你不会过去!
生活故事

我们以CSV格式编写了一些自动测试。 在表格的入口处,在表格的输出处。 在LibreOffice中打开并编辑以查看哪一列。 一切都很棒,一切正常。 虽然列数不等于1024。

这就是生活痛苦开始的地方。 LibreOffice测试将不再打开,因为它不方便使用CSV格式,因为很难理解555列的位置。 您在Excel中打开测试,编辑,保存,运行测试...它位于10个新位置:TIN变坏了。 例如,它很长,为7710152113。Excel会愉快地将其转换为1.2E + 5格式。
其他长号也丢失。

如果该值用引号引起来,则将其包裹在测试不期望的其他引号中。

并且您已经以CSV格式纠正了这些小问题,在脑海中责骂自己了……所以有一个局限,应该记住! 尽管它没有出现在系统本身上,但可以使测试仪的寿命复杂化。

Oracle中的表(数据库)


并且由于我们正在谈论1024列,因此我们将回想一下Oracle(流行的数据库)。 有相同的限制:在一个表中最多可以有1024列。

最好事先记住这一点! 我们有一个表,其中有大约1000列,但有一半留给将来使用:“总有一天会派上用场,这对我们很长一段时间就足够了。” 够了,但时间不长...

无处可扩展表-遇到了限制。 因此,要么将表分成两部分,要么将内容打包在BLOB中:这是一个zip存档,其中的数据原来只占据一列,但其中却包含了任意多的列。

但是无论如何,这就是数据迁移。 数据迁移总是很痛苦。 总体而言,这需要很长时间,带来了只能在六个月内解决的新问题。 如果您可以不进行迁移而做,那就更好了。

如果您有一个包含大量数据的表,请考虑一下未来。 您是否总是适合1024列? 您以后是否需要迁移? 毕竟,系统寿命越长,转移将越困难。 “足够5年”意味着必须迁移5年。

怎么测试呢? 是的,通过代码评估您的数据表,看看它在哪里。 注意大鼠标:那些已经有很多列的表。 将来会不会有问题?

系统报告


但是,为什么我们将文件上传到系统或从Oracle抽取数据? 最有可能为了建立某种报告。 在这里,您还可以应用此助记符。

数据既可以在输入端(很多,恰到好处),也可以在输出端! 这也很重要,因为这些是不同的等价类。

结果,我们测试了数量:

  • 报告栏
  • 线
  • 输入数据;
  • 输出数据(在报告本身中)。

结构(列和行)

我们可以影响行数或列数吗? 有时候可以,我们可以。 在第二项工作中,我测试了报表设计器:左侧有多维数据集,其中包含可水平或垂直放入报表本身的参数名称。 也就是说,您决定要多少行,多少列。

应用助记符。 经过标准报告(阳性测试,“恰好”鼠标)后,我们尝试做一些操作:

  • 1列0行;
  • 0列1行;
  • 1列1行。

然后很多:

  • 最大列数为1行(将所有多维数据集都扔入列中);
  • 最大行数,一列;
  • 如果多维数据集可以复制,那么到处都可以复制,但这是令人怀疑的;
  • 嵌套级别的最大值(这是在一个聚合器列中有另外两个嵌套级时)。

接下来,我们测试输入和输出数据。 即使没有构造函数,并且行数和列数始终相同,我们也可以在任何报表中影响它们。


输入数据

我们了解报告的形成方式。 假设每天都填写一些数据,例如,售出的衣服,夏装和T恤的数量。 在报告中,我们看到按类别,颜色,大小对数据进行分组。 每天/每月/每小时卖出多少钱。

我们建立一个报告,然后我们自己影响输入数据:

  • 通常的数量(每天5件衣服,尽管在巨大的场所,这个数量可能是2000件或更多,但是您需要弄清楚什么对您的系统更有利)。
  • 空的,每月没有售出/售出1件商品。
  • 体积非常大,每种产品,每种颜色,每种尺寸都有最大值。 我们设置最大的“仓库中的谎言”并在一个月甚至一天之内出售所有物品。 报告将怎么说?

输出数据

理论上,输出数据与输入数据相关。 在入口处有一点→在出口处会有一点。 在入口处有很多-在出口处有很多。

但这并不总是有效。 有时可以消除输入数据,或者相反,可以相乘。 然后我们可以以某种方式使用它。

例如, Dadat系统。 您上载一个全名列的文件,在输出中一次得到多个:

  1. 原始名称,文件中的内容;
  2. 拆开的名字(如果可以的话);
  3. 棒 案例
  4. 达特 案例
  5. 创造。 案例
  6. 姓氏
  7. 中间名;
  8. 解析状态-由机制自信地识别或由人验证;

如何从一栏中获得很多收益

我们从一个单元格中得到9,这只是按名称,系统还可以解析地址。 在那里,从一个单元中获得了将近50个:除了颗粒状成分外,还有各种代码KLADR,FIAS,OKATO ...

这里很有趣。 事实证明,我们输入的数据可能很少,但输出的数据却很多。 如果我们检查列中的最大值,则有两个选择:

  • 在输出处有500列(在输入处大约有10个地址);
  • 入口处有500列(出口处有一堆)。

该原理也朝相反的方向起作用。 如果输入是一堆数据而输出是zilch,该怎么办? 如果不是全名而不是“ op34e8n8pe”这样的废话? 然后事实证明,所有其他列都是空的,只有解析为“您向我发送垃圾”的状态。 因此,我们在输出处获得了最小值(一只小老鼠),这也是值得检查的。

如果可以排除扬声器! 当输出为零时,源文件为非空时,可以检查等价类“零”。 您至少可以检查一下他们是否在一百列中保留了1列。

这里最主要的是要记住,除了输入数据之外,我们还有输出数据。 有时,您可以在其中检查边界,这将不取决于输入数据。 然后必须这样做。

行动应用程式


沟通交流


有不同的通讯选项:

  • 正常的
  • 无花果(小老鼠);
  • 超快(大)。

此外,通信不畅的部分原因是:如果您所在区域的Wi-Fi正常且蜂窝网络不佳。 互联网运行良好,但SMS不好。

内存量


应用程序具有多少内存也很重要:

  • 正常金额;
  • 很少
  • 很多

如果在这种情况下可以将第一种测试和第三种测试结合起来,那么小老鼠就非常有趣。 并且有不同的选择:

-在内存已经很少的手机上运行该应用程序;
-在内存正常的情况下运行,崩溃,部署较大的对象并尝试返回到第一个应用程序。

现在,如果应用程序不知道如何正常地保留内存,那么在第二种情况下,它将简单地崩溃,则表明内存已经被挤出。

设备对角线


  • 标准(我们研究市场,看看在我们的用户中更受欢迎)。
  • 最低(电话)。
  • 最大值(大平板电脑)。

屏幕分辨率


  • 标准;
  • 最小的
  • 最大的

不要混淆分辨率和对角线,这是两个不同的东西。 您可能有一个带有大屏幕的旧设备,但是我有一个新的时尚智能手机,其分辨率提高了5倍。 很难想象20年后会发生什么。

GPX路径


GPX路径是具有顺序坐标的XML文件。 可以将它们下载到移动仿真器,以便电话认为它以某种速度在太空中移动。

如果应用程序出于某些目的读取GPS坐标,则很有用。 因此,它本身决定了您是要去,跑步还是骑车。 而且,您不能运行,只能坐在办公室里输入应用程序坐标,设置其通过系数并进行测试。

值得检查的赔率是多少? 全部根据助记符:

  • 1-正常系数,代替简单的步行;
  • 0,01-好像您是在平移meeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
  • 200-甚至不要奔跑,而是飞翔!

为什么要检查所有这些? 可以找到哪些错误?

例如,应用程序可能会在飞机上崩溃–启动,但立即崩溃。 由于它会读取坐标并尝试确定您的速度。 但是谁知道速度会超过130?

在慢速下,应用程序可能会崩溃。 他将为自己设定一百万个中间点,并且无法将其保存在他的记忆中。 就是这样!

另请参阅:
什么是GPX路径?为什么需要测试器? -有关gpx路径的更多信息以及此类文件的示例

常见示例摘要


我想在这里表明,“大,小”似乎是一个数字字段,仅此而已!
但是实际上,助记符可以在任何地方使用,无论是文件,玩具还是报告……它确实有助于我们发现错误。以下是我的一些练习示例:


小鼠标(下限)

-日期01/01/1900

当我从事自由职业时,这个日期对我来说毁了所有报告。因为即使开发人员从傻瓜那里设置了保护,他还是从0000设置了保护。但是他没有从1900设置保护。

-行尾有一个孤独的角色,这个

经验丰富的同事在讨论使用助记符的示例时向我建议了此测试。如果系统检查文件是否为空,则需要检查不是完全为空。

我建议进行此测试:将行终止符添加到文件中。甚至不是空格,而是特殊字符。并查看系统如何响应。她并不总是反应良好=)


大鼠标(上限)

如果我们谈论大鼠标,那么通常会有无数的错误:
-战争与和平;
-大量数据;
-2 GB。

您可以将战争与和平上传至文本字段,将大型文件上传至系统,并获得大量输入或输出数据。这些都是我在练习中遇到的常见错误。而且不仅是我,经常检查上限是因为他们知道可能存在错误。相反,他们忘记了小老鼠。

大型鼠标的另一个示例是压力测试。喔!我有这样的例子,所以我们去讨论一下。

如果您知道上下文,如果您知道应用程序在内部的工作方式,使用哪种编程语言编写的代码,使用的数据库,则也可以使用此助记符。我想用具体的例子来说明这一点。


我的练习例子


大老鼠


Linux,Lucene,Mmap


在Linux操作系统中,有一个用于打开文件描述符的最大数量的设置:

  • redhat-6-/etc/security/limits.conf
  • redhat-7-/ etc / systemd / system / [服务名称] .service.d / limits.conf(每个服务都有自己的名称)

将打开文件描述符,以便对文件执行任何操作:

  • 创建数据库连接;
  • 读取文件;
  • 写入文件。
  • ...

如果您的系统主动处理文件并执行许多操作,则需要增加设置。否则,一丁点的负荷就会把你放进去。

我们的系统使用Lucene搜索索引。这是当我们从数据库中获取一些数据并将其上传到磁盘时,以便以后我们可以更快地搜索它。而且,如果我们使用mmap技术构建索引,那么它将在构建索引的过程中构建大量用于写入的文件。

Lucene + Mmap

该测试库通常有100个客户,也就是1000个。即使不配置描述符,重建也不会出现问题。

在实际系统中,将有10+百万客户。而且,如果您不在那里配置文件描述符的数量,那么当您开始构建索引时,所有内容都会崩溃。

您需要了解这一点,并立即编写一条指令:在服务器上配置操作系统,否则会产生这样的后果。从另一方面来说,重要的是不仅要对真实数据进行功能测试,还要进行压力测试。

红帽6≠红帽7


测试大型鼠标(负载)时,请不要忘记在不同的配置中应用程序将以不同的方式工作。如果您遵循上一段的说明,则不仅必须编写它,而且还要检查它。并检查客户的环境。

因为不同的操作系统工作方式不同。而且,我们的情况似乎是所有内容都已配置,但系统崩溃并显示“我没有足够的打开文件描述符”。我们说:

-检查参数。
-他已经配置好了,一切都按照您的指示进行!

怎么会这样事实证明,我们有有关Redhat 6的说明,而他们有Redhat 7,此处的设置完全不同!结果,他们按照无效的指示进行了操作,好像根本没有这样做。

因此,如果您使用的是不同版本的Linux发行版,则需要全部检查。不仅要在机器上部署服务,还要至少进行一次负载测试:确保一切正常。毕竟,在测试环境中发现错误比以后了解生产更好。

Java和垃圾回收


我们使用具有内置垃圾收集器的Java语言...有时似乎,如果应用程序使用大量内存并且由于某些复杂操作而处于OOM(内存不足)的边缘,那么您可以通过简单地增加可用内存量来轻松解决此问题。 !为什么要测试?

不完全是大量使用Xmx-应用程序将挂在垃圾收集器上……



它对于用户而言突然显现出来。晚上他们在这里施加了很大的负担,下载了很多数据-尤其是在下班后,以免打扰任何人。早晨,用户到了,虽然他是唯一使用该系统的人,但几乎没有负载,一切都挂在他身上。而且他甚至都不明白为什么。

但实际上,由于这种fr,负载已经过去了,负载已经消失了,垃圾收集器已经出来清理所有东西了。尽管现在没有任何负担,一个孤独的用户正在工作,但他还是很伤心。
因此,仅向应用程序分配大量内存“您就无法对其进行测试”-这是行不通的。更好地检查。

野蝇


如果未进行相应配置,WildFly Java应用程序服务器将不允许下载大文件。

图片

我们使用Jboss应用服务器(又名Wildfly)。事实证明,默认情况下您无法将大文件上传到该文件。而且我们还记得鼠标应该很大。如果我们测试5mb或50mb,一切正常,一切都很好。

但是,如果您尝试下载2GB,系统会显示404错误,并且您无法从日志中了解任何内容:该应用程序的日志为空。由于此应用程序无法下载文件,因此Wildfly本身会对其进行剪切。

如果您不自己进行测试,则客户可能会遇到这种情况。这将是非常不愉快的,他会提出一个问题:“为什么不加载?”,而且如果没有开发人员,您将无话可说。因此,最好不要忘记测试边界,包括要放入系统的大型文件。至少您会知道此类操作的结果。

在这里,我们要么通过增加max-post-size参数来修复它,要么提供有关限制的信息并在工作说明中加以规定。

记录中


测试“大”鼠标的另一个示例。是的,她以某种方式想起了更多的例子……她经常发现错误!

假设我们检查错误记录。该错误已写入日志中的堆栈跟踪中。因此,我们检查了一下,感觉非常棒:是的,一切都很棒,一切都已记录!而且我从错误文本的堆栈中了解了所有内容。如果客户跌倒,我会立即理解原因。



如果我们没有一个错误,而是多个错误,将会发生什么?一切都很好,一切都已记录,一切都很好!但是我们记得鼠标应该很大:

图片

如果有很多错误会发生什么?我们只是有这种情况。源系统将数据上载到数据库中的缓冲区表。我们的系统从那里获取这些数据,然后以某种方式与它们一起使用。

源系统崩溃,并上传了不正确的增量,其中所有数据均错误。我们的系统采用了增量,并且有13,600个错误。当Java试图为13k错误生成堆栈跟踪时,她吃了分配给它的所有内存,然后说“哦,java堆空间”。

如何解决?我们在加载任务中添加了参数maxStoredErrors(默认为100),即一个流在内存中存储的最大错误数。达到此数量后,将记录错误并清除列表。

我们还删除了任务和Quarz RunShell有关执行任务的错误消息的重复信息,从而提高了警告后者的日志记录级别(该消息显示在info中)。由于重复,堆栈增加了一倍...

这个故事的结论是什么?仅仅选中“正确”是不够的。是的,这是一项重要且有用的测试,没有人认为。我们查看错误是否原则上记录,在哪个测试中等等。但是,检查BIG鼠标非常重要。如果有很多错误怎么办?

您需要了解“很多”-这意味着很多。如果您加载10个错误的增量,并说“ 10个错误也是正常的,系统将显示所有堆栈跟踪”,则好像他们在进行测试,但没有发现问题。如果我们看到系统显示了所有消息,那么我们需要提前考虑:如果有很多消息会发生什么?并签出。

记录中

音译


- , , ? , , ?

=
=?



, ? , , . :



, «»



Oracle RAC


Oracle是一个流行的数据库。 当您有多个数据库实例时,就使用Oracle RAC。 必须确保关键业务系统的平稳运行:即使一个实例发生故障,其余实例仍可继续工作,用户甚至不会知道它。

如果您使用Oracle RAC,则必须对其进行负载测试。 如果没有,则需要询问与谁站在一起的客户来进行侧面装载。

在这里可能会出现问题-为什么您没有呢? 很简单,测试硬件通常总是较差。 而且,如果该系统仅专注于Oracle,并且RAC使用了二十个客户端中的一个,那么购买它进行测试将是无利可图的,因为RAC非常昂贵。 与客户协商并帮助他进行测试更加容易。

如果不进行负载测试会怎样? 这是生活中的一个例子。

在数据库中,有机会创建一个列并说它是一个自动增量字段。 这意味着您根本不需要填写该字段;数据库会生成它。 有换行吗? 我记录了值“ 1”。 另一条新线? 她的值将为“ 2”。 每个新的价值将越来越大。

因此,例如,生成标识符非常方便。 您始终知道自己的ID是唯一的。 而且,对于每条新线,它都比前一行多了。 理论上...

我们的系统中有两个实体标识符:

  • id-特定版本的标识符,自动递增字段;
  • hid是历史标识符;对于一个实体,它始终是恒定的,并且不会更改。

因此,您可以根据特定版本进行选择,也可以根据实体的隐藏进行选择并查看其整个历史记录。

创建实体后,id =隐藏。 然后id增大,新版本的ID总是比hid大。 因此,确定版本的公式为:

版本=(id-隐藏)+ 1

它不能为负,因为id由数据库本身创建。

但是在这里,他们本质上向我们提出了一个问题,并显示了数据库中的记录。 我不记得那个问题是什么,也没关系。 我看了一下唱片,简直不敢相信:那里的版本带有负面价值。 怎么?? 这是不可能的。 事实证明这是可能的。

在RAC中,每个节点都有自己的缓存。 可能会发生节点之间没有时间互相通知的情况,而平板电脑中您有两次相同的号码:

  • 创建一个实体。 Noda在缓存中查找,自动递增字段的最后一个值是什么? 是的,10。所以我给标识符11。
  • 立即,一个新实体到达第二个节点(请求同时到来,并且平衡器将一个投向节点1,将第二个投向节点2)。
  • 第二个节点在其缓存中查找,该字段的最后一个值是什么? 是的,10岁(第一个节点尚未设法通知第二个节点已使用此数字)。 所以我给标识符11。

RAC中唯一字段如何不再唯一

总计我们收到的不是唯一字段的唯一值。 毕竟,在此类标识符交集的繁重工作中,将不会只有一个甚至两个……如果您将所有业务逻辑与id始终唯一且总是增加的事实联系在一起,那么它将是OU。

在我们的案例中,没有发生灾难性事件,并且在客户的测试台上进行了负载测试。 事实证明,我们很早就发现了问题,系统的负面版本不会干扰生命。 但是,仅在这种情况下,我们在数据库创建脚本中添加了排序排序。

这个寓言的寓意是这样-对将在PROD中使用的同一硬件进行负载测试非常重要。 一切都会影响结果:操作系统本身的设置,数据库的设置等等。 你什至没有怀疑。

预先测试。 请记住,并非所有问题都能通过功能测试找到。 在此示例中,简单的测试不会发现错误。 确实,如果您手动创建实体(即缓慢地创建实体),则所有数据库节点都将有时间通知相邻节点,因此我们不会出现不一致的情况。

小老鼠


空json


如果您使用开放的Axis库,请尝试向应用程序发送空的JSON。 他可能完全将其挂起。

最重要的是-您不能对此做任何事情! 这是第三方库中的错误。 因此,在这里等待正式的更正,或者更改库,这可能非常困难。

实际上,此错误已在新版本的Axis中修复。 似乎只是升级而已! 但是...系统很少使用一个第三方库。 通常它们有几个,它们一个接一个地捆在一起。 要更新它们,您需要立即更新所有内容。 有必要进行重构,因为它们现在的工作方式有所不同。 开发者资源必须分配。

通常,仅更新库的版本有时会需要一个很酷的开发人员整个发布。 因此,例如,当我们迁移到新版本的Lucene时,我们花了56个小时来完成任务,这是7个工作日,一周的专职开发人员需要进行测试。 任务本身看起来像这样,架构师说:

Lucene 切换为使用PointValues代替Long / IntegerField

Lucene Migration 5-> 6扩展坞中有一个子句,用于删除Long(Integer / Double)字段以支持PointValues。

切换到Lucene 6.3.1时,我离开了旧字段(所有类都加上了Legacy前缀进行了重命名),因为转换将拉到单独的任务上。

您需要放弃旧的字段,而使用Long(整数/双精度)Point类,该类更快且在测试中对索引的权重较小。 必须重写很多代码。

好啊 过渡应向后兼容,以使搜索(至少是关键功能)不会因版本升级而中断。 它应该在旧索引上工作(在重建之前),而在重建后(在客户方便的时候),应该选择新字段。
这只是一个库更新! 而且由于存在一个错误而放弃一个库通常很难想象要花多长时间...

因此,很可能在一段时间内您只会遇到bug。 了解他,但是什么都不要改变。 最后,“没有什么可发送愚蠢的请求的。”

但是无论如何,您至少应该了解错误的存在。 因为如果用户来找您说:“所有事情都挂在您身上”,则您必须了解原因。 鉴于日志为空。 因为这不是您的应用程序冻结,所以一切都在JSON转换阶段挂起。

看来-空的要求! 这可能会导致...也就是说,即使您不知道Axis有此类错误,也可以简单地检查空JSON(空SOAP请求)。 最后,这是在JSON请求的上下文中进行零测试的一个很好的例子。

记住要测试零。 最小的价值是小老鼠,因为它还会带来错误,有时会令人恐惧。

另请参阅:
等价类“零不为零” -有关测试零的更多信息

地址字段中的“莫斯科”


Dadat的服务能够使地址标准化-在细粒度组件上将地址安排成一行,并确定公寓的面积(如果它在目录中)。

在测试过程中,发现了一个有趣的错误-如果在地址中输入单词“莫斯科”,则系统会确定公寓的面积。 虽然,看起来,“地址”中的公寓在哪里?

图片

我认为这是“小老鼠”的一个很好的例子。 因为通常检查什么? 通常的地址,就是街道的地址,就是房子的地址。 任何单个字符-这被视为单元测试。

但是,如果输入一个字母,系统将把输入内容确定为完整的废纸clear并清除地址。 它的行为正确,但这是每单位否定的情况。 这是对唯一字段长度的检查。

这里值得更多思考-是否有一个积极的部门? 有。 一句话,这样的系统将决定。 同样,这里也有不同的等价类:它可以是地址(城市)开头的单词,也可以是中间(街道)的单词。 两者都值得尝试。 但是,如果仅将自己限制为“文本字段中的单位=一个字符”,则永远不会发现此错误。

合计


助记符有很多。 并且使用它们可以为您提供帮助。 因为您已经第10次,第100次查看您的应用程序……您已经失去了视线,所以可以跳过明显的错误。 并且,如果您采用了任何现有的助记符,请以新的方式查看应用程序。 什么将有助于检测新的错误。

甚至像宝马这样的简单助记符也有很大帮助。 但是,似乎……大,小,思考! 简单边界值。 但是,必须始终记住并检查它们! 它带来了成果和各种错误。

通过示例,我想表明您不仅可以在文本或数字字段中搜索边框。 助记符可在任何地方使用:在Oracle RAC,Java,Wildfly中以及任何地方! 学会超越通常理解的“在文本框中输入战争与和平”的界限。

当然,主要重点是“大鼠标”,它带来最多的错误。 当您认为自己遇到了项目时,就会回想起这种情况。

但是您不应忘记“小老鼠”。 是的,我仅能回忆起一些具体的例子。 但这并不意味着我没有在小鼠标上找到错误。 我找到了! 常规示例部分中的内容:01.01.1900日期,1 kb文件,填充数据时的空白报告...

边界非常重要。 记住要测试它们。 我希望我的例子能对您有所启发,并且在强调等效类时,BMW助记符将始终在我的脑海中弹出。

图片

也许您会想出自己的助记符。 这将适合您,您的团队,您的功能,您的流程。 这也很棒,也很成功。 最主要的是它有帮助!

PS是为初学者准备的摘录。 在SQA Days的报告中,我还谈到了助记符, 此处是视频

Source: https://habr.com/ru/post/zh-CN418233/


All Articles