应用场景
在API的测试中,有时候需求是对整个文件进行检验而不是某个特定的值,或者说要对某个特定的值在不同的用例中重复地进行验证。这种状况下,我们最喜欢用的就是变量。可以存取外部数据或定义内部变量,使代码变得简洁、又有可阅读性,同时测试用例结果运行也能保持一致性。
学习要点
·如何读取外部文件并进行文件内容的精确对比
·如何读取外部文件并进行文件内容的模糊对比
·使用变量验证某个特定的value是否出现
·使用变量验证某个特定的key是否出现
示例中get url: https://reqres.in/api/users/2
准备工作
如果您想跟着以下示例操作,需要做好以下配置:
·测试框架: Java + Karate + Junit 5
·语言: Java, Cucumber
·IDE: Intellij IDEA
·项目类型: Maven
创建测试场景
1.创建feature文件: testvar-use.feature
2.创建用例
用例一:读取外部文件并进行文件内容的精确对比
如下图中测试场景:用例中发送了一个get的请求以后,期待回应的代码是200,并列出相应的结果。代码And match response == compareResponse 检验返回的结果与期待的结果是否一致 。在Background中代码:* def compareResponse = read('classpath:src/test/resource/comparedContent.json') 定义了变量compareResponse 是读取的文件comparedContent.json的内容。(注:* 符号实际上可以换作 Given, 读取文件的路径: classpath)
如下图所示:comparedContent.json 内容是与 get请求返回的结果一致的。(注: json文件内容格式一定要正确,否则会出现读取文件错误的信息,参看常见错误)
用例二:读取外部文件并进行文件内容的模糊对比
代码And match response == compareResponseIgnoreValue检验返回的结果与期待的结果是否一致 。在Background中定义变量compareResponseIgnoreValue是读取的文件comparedContentIgnoreValue.json。与上例中所不同的是期待文件内容并不完全与返回的相一致。
在comparedContentIgnoreValue.json 中,与上一个用例对比,这里可以看到 "text": 的值换成了"#ignore",当进行对比时,这个字段的内容会忽略。
用例三:使用变量验证某个特定的value是否出现
在用例一、用例二中,同时出现了代码:And match response.ad.url == adUrl , 这里的adUrl 实际就是Background 中自定义变量 * def adUrl = 'http://statuscode.org/' 。
用例四:使用变量验证某个特定的key是否出现
在下面的场景中,代码And match response.ad.text != null 验证了返回结果中ad下text 字段必须存在。
下面两行代码先定义了一个变量notPresentedKey 并且赋予对应的ad下keyNull的字段,然后再验证notPresentedKey 不存在。这里的变量是必需的,否则会出现找不到路径错误。(参看常见错误)
这个变量不能放在Background 在本示例中,因为response是发送get请求以后返回的结果,如果放在Background中,response 还没有返回,引用就会有错。(参看常见错误)
* def notPresentedKey = response.ad.keyNull
And match notPresentedKey == null
常见错误
1.文件读取
用例一,用例二中,当json文件内容格式不正确时,就会现如下运行错误:
2.不使用变量验证不存在的字段
在用例四中,如果直接用And match response.ad.keyNull == null, 会出现如下错误信息,这是因为在验证的时候,会先寻找对应的路径 ad.keyNull, 在返回的结果中是不存在ad.keyNull字段的。)
3.在Background中提前引用response
字段的匹配与写法
如下图所示的正确Json文件格式,整个返回的内容在karate中称作 response。如果要想验证data下的id字段,就可以引用 response.data.id。这里做些补充以免有些初学不清楚如何引用字段(其实这也是我开始学习时感到困惑的哦。)
结语
是不是变量特别好用啊,节省了很多写代码的时间哦,可以看到定义在Background 中的变量看作是全局变量,可以用在任意一个场景中。在某个场景中定义的变量可以说是局部变量。希望小伙伴们灵活灵用,为您的API 测试助力、加油。