{"id":38811811,"url":"https://github.com/lwfwind/smart-api-framework","last_synced_at":"2026-01-17T12:56:06.708Z","repository":{"id":57721198,"uuid":"62606320","full_name":"lwfwind/smart-api-framework","owner":"lwfwind","description":"smart api automation framework to support web service api automaton test based on testng and httpclient","archived":false,"fork":false,"pushed_at":"2017-06-23T10:28:14.000Z","size":514,"stargazers_count":15,"open_issues_count":0,"forks_count":9,"subscribers_count":7,"default_branch":"dev","last_synced_at":"2025-07-06T12:48:44.769Z","etag":null,"topics":["api","automation","http","httpclient","keyword-driver","testng"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lwfwind.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-07-05T04:39:00.000Z","updated_at":"2022-06-08T14:57:23.000Z","dependencies_parsed_at":"2022-09-26T21:41:20.018Z","dependency_job_id":null,"html_url":"https://github.com/lwfwind/smart-api-framework","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/lwfwind/smart-api-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwfwind%2Fsmart-api-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwfwind%2Fsmart-api-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwfwind%2Fsmart-api-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwfwind%2Fsmart-api-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lwfwind","download_url":"https://codeload.github.com/lwfwind/smart-api-framework/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwfwind%2Fsmart-api-framework/sbom","scorecard":{"id":606566,"data":{"date":"2025-08-11","repo":{"name":"github.com/lwfwind/smart-api-framework","commit":"38c4d9e6652a5debacb2d8a7356bab3358fd3d3e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'dev'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"85 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h46c-h94j-95f3","Warn: Project is vulnerable to: GHSA-wf8f-6423-gfxg","Warn: Project is vulnerable to: GHSA-288c-cq4h-88gq","Warn: Project is vulnerable to: GHSA-4gq5-ch57-c2mg","Warn: Project is vulnerable to: GHSA-4w82-r329-3q67","Warn: Project is vulnerable to: GHSA-57j2-w4cx-62h2","Warn: Project is vulnerable to: GHSA-5949-rw7g-wx7w","Warn: Project is vulnerable to: GHSA-5r5r-6hpj-8gg9","Warn: Project is vulnerable to: GHSA-5ww9-j83m-q7qx","Warn: Project is vulnerable to: GHSA-645p-88qh-w398","Warn: Project is vulnerable to: GHSA-6fpp-rgj9-8rwc","Warn: Project is vulnerable to: GHSA-6wqp-v4v6-c87c","Warn: Project is vulnerable to: GHSA-85cw-hj65-qqv9","Warn: Project is vulnerable to: GHSA-89qr-369f-5m5x","Warn: Project is vulnerable to: GHSA-8c4j-34r4-xr8g","Warn: Project is vulnerable to: GHSA-8w26-6f25-cm9x","Warn: Project is vulnerable to: GHSA-9gph-22xh-8x98","Warn: Project is vulnerable to: GHSA-9m6f-7xcq-8vf8","Warn: Project is vulnerable to: GHSA-9mxf-g3x6-wv74","Warn: Project is vulnerable to: GHSA-c8hm-7hpq-7jhg","Warn: Project is vulnerable to: GHSA-cf6r-3wgc-h863","Warn: Project is vulnerable to: GHSA-cggj-fvv3-cqwv","Warn: Project is vulnerable to: GHSA-cjjf-94ff-43w7","Warn: Project is vulnerable to: GHSA-cmfg-87vq-g5g4","Warn: Project is vulnerable to: GHSA-cvm9-fjm9-3572","Warn: Project is vulnerable to: GHSA-f3j5-rmmp-3fc5","Warn: Project is vulnerable to: GHSA-f9hv-mg5h-xcw9","Warn: Project is vulnerable to: GHSA-f9xh-2qgp-cq57","Warn: Project is vulnerable to: GHSA-fmmc-742q-jg75","Warn: Project is vulnerable to: GHSA-fqwf-pjwf-7vqv","Warn: Project is vulnerable to: GHSA-gjmw-vf9h-g25v","Warn: Project is vulnerable to: GHSA-gwp4-hfv6-p7hw","Warn: Project is vulnerable to: GHSA-gww7-p5w4-wrfv","Warn: Project is vulnerable to: GHSA-h3cw-g4mq-c5x2","Warn: Project is vulnerable to: GHSA-h592-38cm-4ggp","Warn: Project is vulnerable to: GHSA-h822-r4r5-v8jg","Warn: Project is vulnerable to: GHSA-jjjh-jjxp-wpff","Warn: Project is vulnerable to: GHSA-m6x4-97wx-4q27","Warn: Project is vulnerable to: GHSA-mph4-vhrx-mv67","Warn: Project is vulnerable to: GHSA-mx7p-6679-8g3q","Warn: Project is vulnerable to: GHSA-mx9v-gmh4-mgqw","Warn: Project is vulnerable to: GHSA-p43x-xfjf-5jhr","Warn: Project is vulnerable to: GHSA-q93h-jc49-78gg","Warn: Project is vulnerable to: GHSA-qjw2-hr98-qgfh","Warn: Project is vulnerable to: GHSA-qr7j-h6gg-jmgc","Warn: Project is vulnerable to: GHSA-qxxx-2pp7-5hmx","Warn: Project is vulnerable to: GHSA-r3gr-cxrf-hg25","Warn: Project is vulnerable to: GHSA-r695-7vr9-jgc2","Warn: Project is vulnerable to: GHSA-rfx6-vp9g-rh7v","Warn: Project is vulnerable to: GHSA-rgv9-q543-rqg4","Warn: Project is vulnerable to: GHSA-rpr3-cw39-3pxh","Warn: Project is vulnerable to: GHSA-v585-23hc-c647","Warn: Project is vulnerable to: GHSA-vfqx-33qm-g869","Warn: Project is vulnerable to: GHSA-w3f4-3q6j-rh82","Warn: Project is vulnerable to: GHSA-wh8g-3j2c-rqj5","Warn: Project is vulnerable to: GHSA-x2w5-5m2g-7h5m","Warn: Project is vulnerable to: GHSA-3f7h-mf4q-vrm4","Warn: Project is vulnerable to: GHSA-78wr-2p64-hpwj","Warn: Project is vulnerable to: GHSA-gwrp-pvrq-jmwv","Warn: Project is vulnerable to: GHSA-cgp8-4m63-fhh5","Warn: Project is vulnerable to: GHSA-6pcc-3rfx-4gpm","Warn: Project is vulnerable to: GHSA-hwj3-m3p6-hj38","Warn: Project is vulnerable to: GHSA-269g-pwp5-87pp","Warn: Project is vulnerable to: GHSA-2qrg-x229-3v8q","Warn: Project is vulnerable to: GHSA-65fg-84f6-3jq3","Warn: Project is vulnerable to: GHSA-f7vh-qwp3-x37m","Warn: Project is vulnerable to: GHSA-fp5r-v3w9-4333","Warn: Project is vulnerable to: GHSA-w9p3-5cr8-m3jj","Warn: Project is vulnerable to: GHSA-2xxh-f8r3-hvvr","Warn: Project is vulnerable to: GHSA-4vrv-ch96-6h42","Warn: Project is vulnerable to: GHSA-cjcf-wm2p-59h5","Warn: Project is vulnerable to: GHSA-g76j-4cxx-23h9","Warn: Project is vulnerable to: GHSA-jcq3-cprp-m333","Warn: Project is vulnerable to: GHSA-m6vm-37g8-gqvh","Warn: Project is vulnerable to: GHSA-pwh7-92h3-mqr6","Warn: Project is vulnerable to: GHSA-j288-q9x7-2f5v","Warn: Project is vulnerable to: GHSA-7r82-7xv7-xcpj","Warn: Project is vulnerable to: GHSA-3mc7-4q67-w48m","Warn: Project is vulnerable to: GHSA-98wm-3w3q-mw94","Warn: Project is vulnerable to: GHSA-9w3m-gqgf-c4p9","Warn: Project is vulnerable to: GHSA-c4r9-r8fh-9vj2","Warn: Project is vulnerable to: GHSA-hhhw-99gj-p3c3","Warn: Project is vulnerable to: GHSA-mjmj-j48q-9wg2","Warn: Project is vulnerable to: GHSA-rvwf-54qp-4r6v","Warn: Project is vulnerable to: GHSA-w37g-rhq8-7m4j"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T01:44:35.060Z","repository_id":57721198,"created_at":"2025-08-21T01:44:35.060Z","updated_at":"2025-08-21T01:44:35.060Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28508831,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T11:50:55.898Z","status":"ssl_error","status_checked_at":"2026-01-17T11:50:55.569Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","automation","http","httpclient","keyword-driver","testng"],"created_at":"2026-01-17T12:56:06.584Z","updated_at":"2026-01-17T12:56:06.687Z","avatar_url":"https://github.com/lwfwind.png","language":"Java","readme":"# Smart-api-framework - a light, common http api automation framework\n\nSmart-api-framework is a light, common http api automation framework based on [TestNG](http://testng.org/doc/index.html) and [HttpClient](http://hc.apache.org/httpcomponents-client-ga/).\n\n* Tags: TestNG, HttpClient, XML, API, Automation, Test, Keyword-driver\n\n## Features\n\n* Support keyword-driver, no coding and easy to config\n* Support to execute run/debug test from xml directly due to the intellij idea plugin [Aping](https://github.com/lwfwind/aping)\n* Support restful web server such as get, post, put and delete http method\n* Support concurrent\n* Re-run failed test cases\n* Easy integration with CI system\n\n## Architecture\n![Architecture](https://github.com/lwfwind/smart-api-framework/blob/dev/pics/Architecture.png)\n\n## XML Structure\n```xml\nTestSuite -- config test url and httpMethod\n    Function -- shared method for all case in current suite, only init once\n    TestCase\n        Before -- preset environment such as database\n        Setup -- config setup url and httpMethod, such as login action\n            Param -- config setup parameters\n        Headers -- config request headers \n            Header -- config Header parameters\n            Cookie -- config Cookie parameters\n        Param -- config test parameters\n        ExpectResults -- config expect result\n            Contain\t-- assert actual result contain specify string\n            Pair -- assert actual result contain specify key-value\n            AssertTrue -- assert expression is true\n        After -- reset environment\n```\n## Example\n### \u0026nbsp;\u0026nbsp; Support shared function for all case in current suite, only init once\n```xml\n\u003cTestSuite url=\"getMethod?\" httpMethod=\"get\"\u003e\n    \u003cFunction name=\"suiteFunctionValue\" clsName=\"test.java.LogicHandler\" methodName=\"getSuiteFunctionValue\" arguments=\"7936160\"/\u003e\n    \u003cFunction name=\"SuiteFunctionMap\" clsName=\"test.java.LogicHandler\" methodName=\"getSuiteFunctionMap\"/\u003e\n    \u003cTestCase name=\"getMethod\" desc=\"getMethod\"\u003e\n        \u003cBefore\u003e\n            \u003cFunction clsName=\"test.java.LogicHandler\" methodName=\"update\" arguments=\"1,0\"/\u003e\n        \u003c/Before\u003e\n        \u003cSetup name=\"setup\" url=\"login\" httpMethod=\"post\"\u003e\n            \u003cParam name=\"username\" value=\"13636426195\"\u003e\n            \u003c/Param\u003e\n            \u003cParam name=\"password\" value=\"bddeaa7037632c856a6b83e4037f314a\" /\u003e\n        \u003c/Setup\u003e\n        \u003cHeaders\u003e\n            \u003cHeader name=\"m-appkey\" value=\"4272\" /\u003e\n            \u003cCookie name=\"unb\" value=\"2020967487\" /\u003e\n        \u003c/Headers\u003e\n        \u003cParam name=\"parameter1\" value=\"#setup.errorCode+1#\" /\u003e\n        \u003cParam name=\"parameter2\" value=\"#suiteFunctionValue#\" /\u003e\n        \u003cParam name=\"parameter3\" value=\"#SuiteFunctionMap.key#\" /\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:#setup.errorCode#或者#setup.errorCode+1#\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:约课成功\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:#if(setup.errorCode==200){\n                return \"约课成功\";\n                }\n                return \"约课失败\";#\u003c/Pair\u003e\n            \u003cContain\u003e.*errorMsg.*\u003c/Contain\u003e\n        \u003c/ExpectResults\u003e\n        \u003cAfter\u003e\n            \u003cFunction clsName=\"test.java.LogicHandler\" methodName=\"reset\"/\u003e\n        \u003c/After\u003e\n    \u003c/TestCase\u003e\n\u003c/TestSuite\u003e\n```\n### \u0026nbsp;\u0026nbsp; Support function/sql action in before/after\n```xml\n\u003cTestSuite url=\"V1/Students/login\" httpMethod=\"post\"\u003e\n    \u003cTestCase name=\"data1\" desc=\"更改手机号登录\"\u003e\n        \u003cBefore\u003e\n            \u003cFunction clsName=\"test.java.LogicHandler\" methodName=\"changeStudentsMobile\" arguments=\"1\"/\u003e\n            \u003cSql\u003eupdate ebk_students set mobile=18078788787 where id=123456;\u003c/Sql\u003e\n        \u003c/Before\u003e\n        \u003cParam name=\"username\" value=\"#sql1.mobile#\"\u003e\n            \u003cSql name=\"sql\"\u003eselect trim(mobile) as mobile,password from ebk_students where id=123456;\n            \u003c/Sql\u003e\n        \u003c/Param\u003e\n        \u003cParam name=\"password\" value=\"#sql.password#\" /\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:登录成功\u003c/Pair\u003e\n        \u003c/ExpectResults\u003e\n        \u003cAfter\u003e\n            \u003cFunction clsName=\"test.java.LogicHandler\" methodName=\"resertStudentMobile\"/\u003e\n            \u003cSql\u003eupdate ebk_students set mobile=888888888 where id=123456;\u003c/Sql\u003e\n        \u003c/After\u003e\n    \u003c/TestCase\u003e\n\u003c/TestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support execute setup action before execution of test method\n```xml\n\u003cTestSuite url=\"V1/ClassRecords/bookClass/\" httpMethod=\"put\"\u003e\n  \u003cTestCase name=\"data1\" desc=\"约课成功\"\u003e\n        \u003cSetup name=\"setup1\" url=\"V1/Students/login/\" httpMethod=\"post\"\u003e\n            \u003cParam name=\"username\" value=\"#sql1.mobile#\"\u003e\n                \u003cSql name=\"sql1\"\u003eselect id,mobile,password from ebk_students where status=1 and acoin\u003e100 \n                and level is not null;\n                \u003c/Sql\u003e\n            \u003c/Param\u003e\n            \u003cParam name=\"password\" value=\"#sql1.password#\" /\u003e\n        \u003c/Setup\u003e\n        \u003cParam name=\"cid\" value=\"#sql4.id#\"\u003e\n            \u003cSql name=\"sql4\"\u003eselect id from ebk_class_records where status=0 and begin_time\u003eunix_timestamp()\n             and free_try=0 ;\n            \u003c/Sql\u003e\n        \u003c/Param\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:约课成功\u003c/Pair\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e\n\u003c/TestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support get param's value from setup action response\n```xml\n\u003cTestSuite url=\"V1/ClassRecords/bookClass/\" httpMethod=\"put\"\u003e\n  \u003cTestCase name=\"data1\" desc=\"约课成功\"\u003e\n        \u003cSetup name=\"setup1\" url=\"V1/Students/login/\" httpMethod=\"post\"\u003e\n            \u003cParam name=\"username\" value=\"#sql1.mobile#\"\u003e\n                \u003cSql name=\"sql1\"\u003eselect id,mobile,password from ebk_students where status=1 and acoin\u003e100 \n                and level is not null;\n                \u003c/Sql\u003e\n            \u003c/Param\u003e\n            \u003cParam name=\"password\" value=\"#sql1.password#\" /\u003e\n        \u003c/Setup\u003e\n        \u003cParam name=\"cid\" value=\"#setup1.id#\" /\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:约课成功\u003c/Pair\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e\n\u003c/TestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support to get param's value from sql/function\n```xml\n\u003cTestSuite url=\"V1/Students/login\" httpMethod=\"post\"\u003e\n    \u003cTestCase name=\"data3\" desc=\"登录成功\"\u003e\n        \u003cParam name=\"username\" value=\"#sql1.mobile#\"\u003e\n            \u003cSql name=\"sql\"\u003eselect trim(mobile) as mobile from ebk_students where password =\n                'e10adc3949ba59abbe56e057f20f883e'  and tx_sig_expiredtime\u003e curdate()+86400;\n            \u003c/Sql\u003e\n        \u003c/Param\u003e\n        \u003cParam name=\"password\" value=\"e10adc3949ba59abbe56e057f20f883e\" /\u003e\n        \u003cParam name=\"code\"\u003e\n            \u003cFunction clsName=\"test.java.LogicHandler\" methodName=\"codeGenerator\" arguments=\"test\"/\u003e\n        \u003c/Param\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:登录成功\u003c/Pair\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e  \n\u003cTestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support Pair/Contain/AssertTrue type for expect results\n```xml\n\u003cTestSuite url=\"V1/Students/login\" httpMethod=\"post\"\u003e\n    \u003cTestCase name=\"data3\" desc=\"登录成功\"\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:#code#\u003c/Pair\u003e\n            \u003cContain\u003e.*(\"id\":\"#sql.mobile#\").*\u003c/Contain\u003e\n            \u003cAssertTrue\u003e\"#code#\"==\"#sql.mobile#\"\u003c/AssertTrue\u003e\n            \u003cSql name=\"sql\"\u003eselect trim(mobile) as mobile from ebk_students where password =\n                            'e10adc3949ba59abbe56e057f20f883e'  and tx_sig_expiredtime\u003e curdate()+86400;\n                        \u003c/Sql\u003e\n            \u003cFunction name=\"code\" clsName=\"test.java.LogicHandler\" methodName=\"codeGenerator\" /\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e  \n\u003cTestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support sql/function for expect results\n```xml\n\u003cTestSuite url=\"V1/Students/login\" httpMethod=\"post\"\u003e\n    \u003cTestCase name=\"data3\" desc=\"登录成功\"\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:#code#\u003c/Pair\u003e\n            \u003cContain\u003e.*(\"id\":\"#sql.mobile#\").*\u003c/Contain\u003e\n            \u003cSql name=\"sql\"\u003eselect trim(mobile) as mobile from ebk_students where password =\n                            'e10adc3949ba59abbe56e057f20f883e'  and tx_sig_expiredtime\u003e curdate()+86400;\n                        \u003c/Sql\u003e\n            \u003cFunction name=\"code\" clsName=\"test.java.LogicHandler\" methodName=\"codeGenerator\" /\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e  \n\u003cTestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support regular expression for expect result in contain/pair both \n```xml\n\u003cTestSuite url=\"V2/ClassRecords/classDetail/\" httpMethod=\"get\"\u003e\n    \u003cTestCase name=\"GetClassDetailSuccess\" desc=\"获取数据成功\"\u003e\n         \u003cParam name=\"username\" value=\"#sql.mobile#\"\u003e\n             \u003cSql name=\"sql\"\u003eselect c.begin_time as begin_time,s.mobile as mobile ,password,c.id as cid \n             from ebk_students as s left join ebk_class_records as c ON s.id = c.sid limit 100;\n             \u003c/Sql\u003e\n        \u003c/Param\u003e\n        \u003cParam name=\"password\" value=\"#sql.password#\" /\u003e\n        \u003cParam name=\"cid\" value=\"#sql.cid#\" /\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:老师已在(QQ|Skype)上等你，快去上课吧\u003c/Pair\u003e\n            \u003cContain\u003e.*(\"id\":\"#sql.cid#\").*(\"begin_time\":\"#sql.begin_time#\").*\u003c/Contain\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e\n\u003c/TestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support execute repeated times(invocationCount)\n```xml\n\u003cTestSuite url=\"V1/Students/login\" httpMethod=\"post\" invocationCount=\"2000\"\u003e\n    \u003cTestCase name=\"data1\" desc=\"更改手机号登录\"\u003e\n        \u003cParam name=\"username\" value=\"#sql1.mobile#\"\u003e\n            \u003cSql name=\"sql\"\u003eselect trim(mobile) as mobile,password from ebk_students where id=123456;\n            \u003c/Sql\u003e\n        \u003c/Param\u003e\n        \u003cParam name=\"password\" value=\"#sql.password#\" /\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:登录成功\u003c/Pair\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e\n\u003cTestSuite\u003e\n```\n\n### \u0026nbsp;\u0026nbsp; Support request headers\n```xml\n\u003cTestSuite url=\"V1/Students/login\" httpMethod=\"post\"\u003e\n    \u003cTestCase name=\"data1\" desc=\"更改手机号登录\"\u003e\n        \u003cHeaders\u003e\n            \u003cHeader name=\"Content-Type\" value=\"application/x-www-form-urlencoded;charset=UTF-8\" /\u003e\n            \u003cCookie name=\"PHPSESSIONID\" value=\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\" /\u003e\n        \u003c/Headers\u003e\n        \u003cParam name=\"key\" value=\"value\" /\u003e\n        \u003cExpectResults\u003e\n            \u003cPair\u003eerrorCode:200\u003c/Pair\u003e\n            \u003cPair\u003eerrorMsg:成功\u003c/Pair\u003e\n        \u003c/ExpectResults\u003e\n    \u003c/TestCase\u003e\n\u003cTestSuite\u003e\n```\n\nDemo project please refer to  [smart-api-automation-example](https://github.com/lwfwind/smart-api-automation-example)\n\n## Contributors\n   Charlie [https://github.com/zhuyecao321](https://github.com/zhuyecao321)\u003cbr/\u003e\n   Niki    [https://github.com/ZhangyuBaolu](https://github.com/ZhangyuBaolu)\u003cbr/\u003e\n   Wind    [https://github.com/lwfwind](https://github.com/lwfwind)\u003cbr/\u003e","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flwfwind%2Fsmart-api-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flwfwind%2Fsmart-api-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flwfwind%2Fsmart-api-framework/lists"}