UNPKG

testrail-integration

Version:
393 lines (281 loc) 11 kB
# testrail-integration tool # Please use below version to support only testrail APi's without cucumber # You can try with the new version also ```text npm i testrail-integration@0.1.7 ``` #Upcoming features - Going to support Mocha integration ## Highlights - It supports CommonJS, ES, ECMACScript and TypeScript - Supports all Testrail api's that are available - Pretty easy to use this library for JS and non JavaScript developers - It supports Cucumber, Mocha and other frameworks as well - It helps integration testing with all testing frameworks - Handled all exceptions, so no need to use try catch blocks - Well managed responses - Interfaces already implemented, so use it directly - more customized options for step results - async and awaits are supported - Actively maintained -Please check API reference: https://www.gurock.com/testrail/docs/api ## Please refer below git urls for Cucumber Integration with testrail - it supports Protractor , WebdriverIO and other tools which supports cucumber framework ```text Testrail integrations with CUCUMBER scenarios by just adding cucumber tags ex: @c1234 @Bug-DSS-3467 ``` - https://github.com/automatekitbox/testrail-api-integration/blob/main/README.md - https://github.com/automatekitbox/testrail-api-integration/blob/main/cucumbertestrail.png #Tip ```text Always update test result after execution of test case Use After hook You will not miss previous testcase results if something aborts in the middle of test execution ``` #Handling right error messages ```json { "message": "Response code 400 (Bad Request)", "name": "HTTPError", "host": "inc1.testrail.io", "url": "https://inc1.testrail.io/index.php?/api/v2/add_result_for_case/1/156789", "path": "/index.php?/api/v2/add_result_for_case/1/156789", "body": "\"{\\\"error\\\":\\\"Field :case_id is not a valid test case.\\\"}\"" } ``` # Ex: handle error with catch ```js try { await testrail.getCased(caseId); } catch ( err) { console.log( err); } ``` ## Sample code for JS and TS(typescript) - Refer interfaces to know what data needs to be passed otherwise use implemented interfaces directly - https://github.com/automatekitbox/testrail-api-integration/blob/main/testrail.interface.ts - Sample code ```js const {INewTestResultImpl } = require("testrail-integration"); const content = new INewTestResultImpl(); content.comment = "FIRST COMMENT"; content.version = "Build#1"; content.defects = "DSS-123"; ``` # getTests(run_id: number) ```js const { TestRailClient } = require("testrail-integration"); (async () => { const options = { username: "abc@gmail.com", password: "pwd", url: "https://my.testrail.io" } const client = new TestRailClient(options); const res = await client.getTests(1); console.log(JSON.stringify(res)); })(); ``` # TypeScript ```typescript jsx import {TestRailClient} from "testrail-integration"; const options = { username: "abc@gmail.com", password: "pwd", url: "https://my.testrail.io" } const client = new TestRailClient(options); const res = await client.getTests(1); console.log(JSON.stringify(res)); ``` # addResultForCase(runId: number, caseId: number, content: INewTestResult) ```js const { TestRailClient } = require("testrail-integration"); (async () => { const options = { username: "abc@gmail.com", password: "pwd", url: "https://my.testrail.io" } const client = new TestRailClient(options); const content = { comment: "FIRST COMMENT", version: "Build#1", defects: "DSS-123", status_id: 5 //fail } const testResult = await client.addResultForCase(1, 2, content ); console.log("Test Results property wise" + testResult.status_id + testResult.comment + testResult.defects); console.log("Test Results" + JSON.stringify(testResult)); })(); ``` # using Interface - better approach ```js const { TestRailClient, INewTestResultImpl } = require("testrail-integration"); (async () => { const options = { username: "abc@gmail.com", password: "pwd", url: "https://my.testrail.io" } const client = new TestRailClient(options); //Using Interface implentation const content = new INewTestResultImpl(); content.comment = "FIRST COMMENT"; content.version = "Build#1"; content.defects = "DSS-123"; status_id: 1; //pass const testResult = await client.addResultForCase(1, 2, content ); console.log("Test Results property wise" + testResult.status_id + testResult.comment + testResult.defects); console.log("Test Results" + JSON.stringify(res1)); })(); ``` ## addResultsForCases(runId: number, results: INewTestResults[]) ==> update test result for multiple cases - Sending content directly ```js const { TestRailClient } = require("testrail-integration"); (async () => { const options = { username: "abc@gmail.com", password: "pwd", url: "https://my.testrail.io" } const client = new TestRailClient(options); const content = [{ case_id: 4, comment: "FIRST COMMENT", version: "Build#1", status_id: 1 //pass }, { comment: "SECOND COMMENT", version: "Build#1", defects: "DSS-124", status_id: 5 //fail } ] const res1 = await client.addResultsForCases(1, content ); console.log("Test Results property wise for each case" + res1[0].status_id + res1[1].status_id ); console.log("Test Results" + JSON.stringify(res1)); })(); ``` # Using Interface to update multiple testcase results ```js const { TestRailClient, INewTestResultsImpl } = require("testrail-integration"); (async () => { const options = { username: "abc@gmail.com", password: "pwd", url: "https://my.testrail.io" } const client = new TestRailClient(options); const newTestResults = []; const firstCaseResult = new INewTestResultsImpl(); firstCaseResult.case_id = 1; firstCaseResult.comment = "ARRAY!"; firstCaseResult.status_id = 5; newTestResults.push(firstCaseResult); const secondCaseResult = new INewTestResultsImpl(); secondCaseResult.case_id = 19; secondCaseResult.comment = "ARRAY!"; secondCaseResult.status_id = 5; secondCaseResult.push(secondCaseResult); const res = await client.addResultsForCases(1, newTestResults ); console.log("Test Results" + JSON.stringify(res)); })(); ``` ## addRun(projectId: number, content: INewTestRun): - Provide suite_id if it is applicable Note: Free trail , we will not see suites, so we create testcases without suite ```js //Free Trial testrail const myNewRun = { name: "My TESTRUN!", description: "MY NEW RUN ONE" }; const addRun = await client.addRun(1, myNewRun); //Official testrail, your testcases belongs to suite, so suite_id is mandatory const myNewRun = { suite_id: 2, name: "My TESTRUN!", description: "MY NEW RUN ONE" }; const newRunResult = await client.addRun(1, myNewRun); console.log("New Run Details" + JSON.stringify(newRunResult)); ``` # //----- ADD RUNS AND Cases - supported wrapper to get run_id > getRunId(projectId: number, runName: string): <number> > addRun(projectId: number, content: INewTestRun) > getRun(runId: number) > getRuns(projectId: number) > updateRun(runId: number, content: INewTestRun) > getCase(caseId: number): returns <ICase> > getCases(projectId: number, caseFilters: ICaseFilters) > addCase(sectionId: number, content: ICase) > updateCase(caseId: number, content: ICaseUpdate) > deleteCase(caseId: number) > deleteCases(projectId: number, suiteId: number, soft: number = 1, caseIds: number[]) # // ----- Case Fields ----- > getCaseFields() # // ----- Case Types ----- > getCaseTypes() # // ----- Configurations ----- > getConfigs(project_id: number) > addConfigGroup(project_id: number, content: IConfigurationUpdate) > addConfig(config_group_id: number, content: IConfigurationUpdate) > updateConfigGroup(config_group_id: number, content: IConfigurationUpdate) > updateConfig(config_id: number, content: IConfigurationUpdate) > deleteConfigGroup(config_group_id: number) > deleteConfig(config_id: number) # // ----- Milestones ----- > getMilestone(milestone_id: number) > getMilestones(project_id: number, filters: IMilestoneFilters) > addMilestone(project_id: number, content: INewMilestone) > updateMilestone(milestone_id: number, content: IMilestoneUpdate) > deleteMilestone(milestone_id: number) # // ----- Plans ----- > getPlan(plan_id: number) > getPlans(project_id: number, filters: any) > addPlan(project_id: number, content: any) > addPlanEntry(plan_id: number, content: any) > updatePlan(plan_id: number, content: any) > updatePlanEntry(plan_id: number, entry_id: number, content: any) > closePlan(plan_id: number) > deletePlan(plan_id: number) > deletePlanEntry(plan_id: number, entry_id: number) # // ----- Priorities ----- > getPriorities() # // ----- Projects ----- > getProject(project_id: number) > getProjects(filters: IProjectFilters) > addProject(content: IProjectUpdate) > updateProject(project_id: number, content: IProjectUpdate) > deleteProject(project_id: number) # // ----- Results ----- > getResults(test_id: number, filters: ITestResultFilters) > getResultsForCase(run_id: number, case_id: number, filters: ITestResultFilters) > getResultsForRun(run_id: number, filters: ITestResultsForRunFilters) > addResult(test_id: number, content: INewTestResult) > addResults(run_id: number, content: INewTestResult[]) # // ----- Result Fields ----- > getResultFields() # // ----- Sections ----- > getSection(section_id: number) > getSections(project_id: number, filters: any) > addSection(project_id: number, content: INewSection) > updateSection(section_id: number, content: ISectionUpdate) > deleteSection(section_id: number) # // ----- Statuses ----- > getStatuses() # // ----- Suites ----- > getSuite(suite_id: number) > getSuites(project_id: number) > addSuite(project_id: number, content: INewSuite) > updateSuite(suite_id: number, content: INewSuite) > deleteSuite(suite_id: number) # // ----- Templates ----- > getTemplates(project_id: number) ## ----- Tests ----- > getTest(test_id: number) > getTests(run_id: number, filters?: { status_id?: number | number[] }) ## ----- Users ----- > getUser(user_id: number) > getUserByEmail(email: string) > getUsers() #### Publishing changes Document is in progress! Queries at letautomate@gmail.com ## License Please see [LICENSE.md](LICENSE.md).