CATS简介
CATS是一款REST API模糊测试和负面测试工具,专为OpenAPI端点打造。它利用预设的Fuzzer集合,自动生成覆盖各种边界条件和负面场景的测试,无需编写任何代码。CATS的核心优势在于其全面性、智能性、高度可配置性、自我修复能力以及易用性。
CATS的主要功能
自动化测试生成与运行:CATS能够根据OpenAPI规范文件,自动生成大量的API测试。这些测试涵盖了各种请求字段、头部信息和边界条件,确保API在各种情况下都能稳定运行。
智能Fuzzer集合:CATS内置了100+个Fuzzer,这些Fuzzer能够根据不同的数据类型和结构约束生成测试数据。无论是随机的大型Unicode值,还是基于请求数据类型和约束精心设计的值,CATS都能轻松应对。
高度可配置性:CATS提供了丰富的自定义选项,允许用户根据需求筛选特定的Fuzzer、HTTP响应码、HTTP方法、请求路径等。此外,用户还可以提供业务上下文,使测试更加贴近实际应用场景。
自我修复能力:当OpenAPI规范发生变化时,CATS能够自动更新测试,确保测试始终与最新的API规范保持一致。这一特性极大地减少了维护测试的工作量。
直观易用的报告:CATS生成的测试报告简洁明了,包含了测试的详细信息、结果和失败原因。这有助于用户快速定位问题并采取相应的修复措施。
CATS的使用方法
安装
Homebrew
brew tap endava/tap
brew install cats
手动安装
下载操作系统原生二进制文件后,添加到PATH中,并将其作为任何其他命令行工具执行:
sudo cp cats /usr/local/bin/cats
cats -h
使用uberjar运行CATS。需要安装Java 17+。
java -jar cats.jar
Windows没有本机二进制文件,但可以使用uberjar版本。
前往发布页面下载最新版本:https://github.com/Endava/cats/releases.
运行
黑盒模式
黑盒模式,CATS不需要任何上下文,只需要URL、OpenAPI规范以及身份验证的请求头。
cats --contract=openapi.yaml --server=http://localhost:8080 --headers=headers.yml --blackbox
在黑盒模式下,CATS尽在接收到响应码为5XX时才会报错(501除外)。Fuzzer预期与服务直接的任何其他不匹配,都将视为成功。
黑盒模式用户冒烟测试。只会告诉你应用是否有服务端重大错误。
上下文模式
每个Fuzzer都有一个预期的HTTP响应码。断言响应是否与对应的OpenAPI规范中定义的模式相匹配。
在上下文模式下运行,需要提供给一个--refData
文件。
cats --contract=openapi.yaml --server=http://localhost:8080 --headers=headers.yml --refData=referenceData.yml
模糊模式
CATS可以进行连续模糊测试(模糊直到满足特定的停止条件),连续模糊在执行时具有更多的随机性,进行连续模糊测试时,需要提供matchXXX条件:
cats random --contract=openapi.yaml --server=http://localhost:8080 -H "API-KEY=$token" --mc 500 --path "/users/auth" -X POST --stopAfterTimeInSec 10
回放测试
CATS将输出一个HTML文件(将在摘要报告中链接)和单个JSON文件。JSON文件可用于在以后回放测试。在回放测试(或测试列表)时,默认情况下,CATS不会生成任何报告。输出将仅在控制台中可用。
cats replay "Test1,Test233,Test15.json,dir/Test19.json"
测试名称用逗号分隔,如果测试名称是.json
结尾,则这个文件将作为路径进行搜索。如果没有.json
,CATS会在CATS-report文件夹中搜索该测试。即CATS-report/Test1.json和CATS-report/Test233.json。
OpenAPI规范
CATS为最常见的OpenAPI规范(如日期时间、电子邮件、二进制)提供了自定义生成器,并扩展了更多其他格式,以便生成尽可能有意义的数据。下面可以找到格式字段中可以使用的值与CATS将生成的值之间的映射。这也将对API的消费者非常有帮助,不仅仅是对CATS。此外,CATS可能会从属性名称推断数据格式。映射表中明确提到了这一点。
OpenAPI format | Property Name | What CATS generates |
---|---|---|
bcp47 | N/A | en-US |
byte or binary | N/A | base64 encoded string |
cardNumber | or name ends withcardNumber | 4111111111111111 |
iso3166alpha2 | N/A | US |
iso3166alpha3 | N/A | USA |
iso-3166 or countryCode | or name ends with countryCode | USA |
iso-4217 orcurrencyCode | or name ends with currencyCode | USD |
date | N/A | 2022-10-25 |
date-time | N/A | 2011-12-03T10:15:30Z |
duration | N/A | P1DT30H4S |
email | or name ends with email or emailAddress | cool@cats.io |
ean8 or gtin8 | N/A | 40170725 |
gtin13 or ean13 | or europeanArticleNumber , globalTradeItemNumber or globalTradeNumber | 5710798389878 |
hostname | N/A | www.endava.com |
idn-email | N/A | cööl.cats@cats.io |
idn-hostname | N/A | www.ëndava.com |
ip or ipv4 | or name ends with ip or ipAddress | 10.10.10.20 |
ipv6 | or name ends with ipv6 | 21DA:D3:0:2F3B:2AA:FF:FE28:9C5A |
iri | N/A | http://ëxample.com/cats |
iri-reference | N/A | /füzzing/ |
isbn or isbn10 | or name equals isbn or isbn10 | 0439023481 |
isbn13 | or name equals isbn13 | 9780439023481 |
json-pointer | N/A | /item/0/id |
password | N/A | catsISc00l?!useIt# |
period | N/A | P1DT30H4S |
regex | N/A | [a-z0-9]+ |
relative-json-pointer | N/A | 1/id |
time | N/A | 10:15:30Z |
uri or url | or name equals or ends with url or uri | http://example.com/cats |
uri-reference | N/A | /fuzzing/ |
uri-template | N/A | /fuzzing/{path} |
uuid | N/A | c58919de-3210-4549-87fa-c196324d0594 |
Reference Data File
大多时候,为了使接口请求成功,某些字段需要包含相关数据。CATS考虑此类参考数据。可以使用--refData
参数指定这些值。参数为一个YAML文件,为不同的接口路径指定固定值。
path1:
prop1: value1
prop2: value2
path2:
prop21: value21
参考数据优先与Fuzzers提供的值
Headers File
headers文件可用于发送固定请求头。最常见的是身份验证请求头。请求头可以是特定于路径的,也可以使用all
元素适用于所有路径。特定路径将优先于所有元素。
all:
Accept: application/json
/path/0.1/auth:
jwt: XXXXXXXXXXXXX
/path/0.2/cancel:
jwt: YYYYYYYYYYYYY