# Google测试工师的一道面试题目



最近重读《Google软件测试之道》，其中有一道面向软件测试工程师的面试题非常考验测试人员的思维。拿来与你们分享，看看这样一道题，你能想到多少个测试点。

题目：

在一个Web测试页面上，有一个输入框，一个计数器（count）按钮，用于计算一个文本字符串中字母a出现的个数。这里的问题是，请设计一系列字符串用以测试这个Web页面。

![](http://img.testclass.net/google_test_subject.png)

题目非常简单，看到这个题目不要上来就开始设计用例，最好能有一些思考，这样看起来更加“专业”。

（题外话，我在参加产品需求评审的时候也会问许多问题，尤其是产品需求并没完全确定下来的时候，站在用户的角度，我也是用户啊，我是否喜欢这个功能？）

所以，我第一个想到的是设计这个功能的背景，因为同样一个功能，在不同的背景下，测试需要考虑的点可能是不一样的。例如，同样是一个搜索功能，百度的搜索和淘宝的搜索就有很大不同，因为用户的使用场景完全不同，输入搜索的关键字和预期结果也不一样。

当然，这只是一道题，你根据题目回答就好了。


不过，我们仍然可以就题目本身来提一些问题：大写还是小写？只是英文么？计算完成后文本会被清除码？多次按下按钮会发生什么事情？…..

接下来你假装有条不紊的设计用例（思考一会儿，然后再输入一串字符，然后再思考…），而不是看起来像monkey试图破坏软件（拼命的敲击键盘…）。

* “banana”：3（一个合法的英文字）。
* “A” 和“a”：1（一个简单有正常结果的合法输入）。
* “”：0（一个简单的结果为0的合法输入）。
* Null：0（简单的错误输入）。
* “AA” 和“aa”：2（个数大于1并且所有字符都为a/A的输入）。
* “b”：0（一个简单的非空合法输入，结果为0）。
* “aba”：2（目标字符出现在开头和结尾，以寻找循环边界错误）。
* “bab”：1（目标字符出现在中间）。
* space/tabs：N（空白字符与N个a的混合）。
* 不包含a的长字符串：N（N大于0）。
* 包含a的长字符串：N（N是a的倍数）。
* {java/C/HTML/JavaScript}：N是a出现的个数（可执行字符，或错误，或代码解释）。
* ...

更优秀的测试工程师，应该跳出输入本身，设计以下用例。

* 质疑界面的外观、调色板和对比度（这与相关应用风格一致么？）
* 文本框太小了，建议加长以便显示更长的输入字符串
* 这个应用能否在同一台服务器上运行多个实例，多个用户同时使用是否会有问题。
* 是否会根据用户的输入自动匹配内容？
* 建议使用真实的数据，如从词典或书中选择输入内容。
* 提出疑问：“输入的数据是否会被保存”，输入字符串可能包含地址或其他身份信息。
* 输入HTML和JavaScrip，看是否会破坏页面渲染。
* 尝试复制/粘贴字符串。
* 提出疑问：“计算足够快么？在大并发下使用”。
* 提出提问：“用户怎么找到该页面？”

还有一些测试点，只有经验丰富的测试工程师才会想到。

* 意识到计算会通过URL-encodedHTTP GET请求传递到服务器，字符串可能会在网络传输时被截断，因此，无法保证支持多长的URL。
* 建议将此功能参数化，为什么只对字母a计算呢？
* 考虑计算其它语言中的a（α，Alpha）。
* 考虑到该应用是否应该国际化。
* 考虑编写脚本或者手工采样来探知字符串长度的上限，然后确保在此区间内功能正常。
* 考虑背后的实现和代码。也许已经有一个计数器遍历该字符串。
* 提出疑问：“HTTP POST方法和参数会被黑掉码？也许有安全漏洞？”
* 用脚本创建各种有趣的排列组合和字符串特性，如长度、a的个数等，自动生成测试输入和验证。




原始封面

![课程图片](https://images.unsplash.com/photo-1552664730-d307ca884978?w=300)


