Best Ginkgo code snippet using internal.BuildTree
suite_test.go
Source:suite_test.go
...37 rt = NewRunTracker()38 suite = internal.NewSuite()39 })40 Describe("Constructing Trees", func() {41 Describe("PhaseBuildTopLevel vs PhaseBuildTree", func() {42 var err1, err2, err3 error43 BeforeEach(func() {44 err1 = suite.PushNode(N(ntCon, "a top-level container", func() {45 rt.Run("traversing outer")46 err2 = suite.PushNode(N(ntCon, "a nested container", func() {47 rt.Run("traversing nested")48 err3 = suite.PushNode(N(ntIt, "an it", rt.T("running it")))49 }))50 }))51 })52 It("only traverses top-level containers when told to BuildTree", func() {53 fmt.Fprintln(GinkgoWriter, "HELLO!")54 Ω(rt).Should(HaveTrackedNothing())55 Ω(suite.BuildTree()).Should(Succeed())56 Ω(rt).Should(HaveTracked("traversing outer", "traversing nested"))57 rt.Reset()58 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)59 Ω(rt).Should(HaveTracked("running it"))60 Ω(err1).ShouldNot(HaveOccurred())61 Ω(err2).ShouldNot(HaveOccurred())62 Ω(err3).ShouldNot(HaveOccurred())63 })64 })65 Describe("InRunPhase", func() {66 It("returns true when in the run phase and false when not in the run phase", func() {67 falsey := true68 truey := false69 err := suite.PushNode(N(ntCon, "a top-level container", func() {70 falsey = suite.InRunPhase()71 suite.PushNode(N(ntIt, "an it", func() {72 truey = suite.InRunPhase()73 }))74 }))75 Ω(suite.BuildTree()).Should(Succeed())76 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)77 Ω(err).ShouldNot(HaveOccurred())78 Ω(truey).Should(BeTrue())79 Ω(falsey).Should(BeFalse())80 })81 })82 Context("when pushing nodes during PhaseRun", func() {83 var pushNodeErrDuringRun error84 BeforeEach(func() {85 err := suite.PushNode(N(ntCon, "a top-level container", func() {86 suite.PushNode(N(ntIt, "an it", func() {87 rt.Run("in it")88 pushNodeErrDuringRun = suite.PushNode(N(ntIt, "oops - illegal operation", cl, rt.T("illegal")))89 }))90 }))91 Ω(err).ShouldNot(HaveOccurred())92 Ω(suite.BuildTree()).Should(Succeed())93 })94 It("errors", func() {95 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)96 Ω(pushNodeErrDuringRun).Should(HaveOccurred())97 Ω(rt).Should(HaveTracked("in it"))98 })99 })100 Context("when the user attempts to fail during PhaseBuildTree", func() {101 BeforeEach(func() {102 suite.PushNode(N(ntCon, "a top-level container", func() {103 failer.Fail("boom", cl)104 panic("simulate ginkgo panic")105 }))106 })107 It("errors", func() {108 err := suite.BuildTree()109 Ω(err.Error()).Should(ContainSubstring(cl.String()))110 Ω(err.Error()).Should(ContainSubstring("simulate ginkgo panic"))111 })112 })113 Context("when the user panics during PhaseBuildTree", func() {114 BeforeEach(func() {115 suite.PushNode(N(ntCon, "a top-level container", func() {116 panic("boom")117 }))118 })119 It("errors", func() {120 err := suite.BuildTree()121 Ω(err).Should(HaveOccurred())122 Ω(err.Error()).Should(ContainSubstring("boom"))123 })124 })125 Describe("Suite Nodes", func() {126 Context("when pushing suite nodes at the top level", func() {127 BeforeEach(func() {128 err := suite.PushNode(N(types.NodeTypeBeforeSuite))129 Ω(err).ShouldNot(HaveOccurred())130 err = suite.PushNode(N(types.NodeTypeAfterSuite))131 Ω(err).ShouldNot(HaveOccurred())132 })133 Context("when pushing more than one BeforeSuite node", func() {134 It("errors", func() {135 err := suite.PushNode(N(types.NodeTypeBeforeSuite))136 Ω(err).Should(HaveOccurred())137 err = suite.PushNode(N(types.NodeTypeSynchronizedBeforeSuite))138 Ω(err).Should(HaveOccurred())139 })140 })141 Context("when pushing more than one AfterSuite node", func() {142 It("errors", func() {143 err := suite.PushNode(N(types.NodeTypeAfterSuite))144 Ω(err).Should(HaveOccurred())145 err = suite.PushNode(N(types.NodeTypeSynchronizedAfterSuite))146 Ω(err).Should(HaveOccurred())147 })148 })149 })150 Context("when pushing a serial node in an ordered container", func() {151 Context("when the outer-most ordered container is marked serial", func() {152 It("succeeds", func() {153 var errors = make([]error, 3)154 errors[0] = suite.PushNode(N(ntCon, "top-level-container", Ordered, Serial, func() {155 errors[1] = suite.PushNode(N(ntCon, "inner-container", func() {156 errors[2] = suite.PushNode(N(ntIt, "it", Serial, func() {}))157 }))158 }))159 Ω(errors[0]).ShouldNot(HaveOccurred())160 Ω(suite.BuildTree()).Should(Succeed())161 Ω(errors[1]).ShouldNot(HaveOccurred())162 Ω(errors[2]).ShouldNot(HaveOccurred())163 })164 })165 Context("when the outer-most ordered container is not marked serial", func() {166 It("errors", func() {167 var errors = make([]error, 3)168 errors[0] = suite.PushNode(N(ntCon, "top-level-container", Ordered, func() {169 errors[1] = suite.PushNode(N(ntCon, "inner-container", func() {170 errors[2] = suite.PushNode(N(ntIt, "it", Serial, cl, func() {}))171 }))172 }))173 Ω(errors[0]).ShouldNot(HaveOccurred())174 Ω(suite.BuildTree()).Should(Succeed())175 Ω(errors[1]).ShouldNot(HaveOccurred())176 Ω(errors[2]).Should(MatchError(types.GinkgoErrors.InvalidSerialNodeInNonSerialOrderedContainer(cl, ntIt)))177 })178 })179 })180 Context("when pushing BeforeAll and AfterAll nodes", func() {181 Context("in an ordered container", func() {182 It("succeeds", func() {183 var errors = make([]error, 3)184 errors[0] = suite.PushNode(N(ntCon, "top-level-container", Ordered, func() {185 errors[1] = suite.PushNode(N(types.NodeTypeBeforeAll, func() {}))186 errors[2] = suite.PushNode(N(types.NodeTypeAfterAll, func() {}))187 }))188 Ω(errors[0]).ShouldNot(HaveOccurred())189 Ω(suite.BuildTree()).Should(Succeed())190 Ω(errors[1]).ShouldNot(HaveOccurred())191 Ω(errors[2]).ShouldNot(HaveOccurred())192 })193 })194 Context("anywhere else", func() {195 It("errors", func() {196 var errors = make([]error, 3)197 errors[0] = suite.PushNode(N(ntCon, "top-level-container", func() {198 errors[1] = suite.PushNode(N(types.NodeTypeBeforeAll, cl, func() {}))199 errors[2] = suite.PushNode(N(types.NodeTypeAfterAll, cl, func() {}))200 }))201 Ω(errors[0]).ShouldNot(HaveOccurred())202 Ω(suite.BuildTree()).Should(Succeed())203 Ω(errors[1]).Should(MatchError(types.GinkgoErrors.SetupNodeNotInOrderedContainer(cl, types.NodeTypeBeforeAll)))204 Ω(errors[2]).Should(MatchError(types.GinkgoErrors.SetupNodeNotInOrderedContainer(cl, types.NodeTypeAfterAll)))205 })206 })207 })208 Context("when pushing a suite node during PhaseBuildTree", func() {209 It("errors", func() {210 var pushSuiteNodeErr error211 err := suite.PushNode(N(ntCon, "top-level-container", func() {212 pushSuiteNodeErr = suite.PushNode(N(types.NodeTypeBeforeSuite, cl))213 }))214 Ω(err).ShouldNot(HaveOccurred())215 Ω(suite.BuildTree()).Should(Succeed())216 Ω(pushSuiteNodeErr).Should(HaveOccurred())217 })218 })219 Context("when pushing a suite node during PhaseRun", func() {220 It("errors", func() {221 var pushSuiteNodeErr error222 err := suite.PushNode(N(ntIt, "top-level it", func() {223 pushSuiteNodeErr = suite.PushNode(N(types.NodeTypeBeforeSuite, cl))224 }))225 Ω(err).ShouldNot(HaveOccurred())226 Ω(suite.BuildTree()).Should(Succeed())227 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)228 Ω(pushSuiteNodeErr).Should(HaveOccurred())229 })230 })231 })232 Describe("Cleanup Nodes", func() {233 Context("when pushing a cleanup node during PhaseTopLevel", func() {234 It("errors", func() {235 err := suite.PushNode(N(types.NodeTypeCleanupInvalid, cl))236 Ω(err).Should(MatchError(types.GinkgoErrors.PushingCleanupNodeDuringTreeConstruction(cl)))237 })238 })239 Context("when pushing a cleanup node during PhaseBuildTree", func() {240 It("errors", func() {241 var errors = make([]error, 2)242 errors[0] = suite.PushNode(N(ntCon, "container", func() {243 errors[1] = suite.PushNode(N(types.NodeTypeCleanupInvalid, cl))244 }))245 Ω(errors[0]).ShouldNot(HaveOccurred())246 Ω(suite.BuildTree()).Should(Succeed())247 Ω(errors[1]).Should(MatchError(types.GinkgoErrors.PushingCleanupNodeDuringTreeConstruction(cl)))248 })249 })250 Context("when pushing a cleanup node in a ReportBeforeEach node", func() {251 It("errors", func() {252 var errors = make([]error, 4)253 reportBeforeEachNode, _ := internal.NewReportBeforeEachNode(func(_ types.SpecReport) {254 errors[3] = suite.PushNode(N(types.NodeTypeCleanupInvalid, cl))255 }, types.NewCodeLocation(0))256 errors[0] = suite.PushNode(N(ntCon, "container", func() {257 errors[1] = suite.PushNode(reportBeforeEachNode)258 errors[2] = suite.PushNode(N(ntIt, "test"))259 }))260 Ω(errors[0]).ShouldNot(HaveOccurred())261 Ω(suite.BuildTree()).Should(Succeed())262 Ω(errors[1]).ShouldNot(HaveOccurred())263 Ω(errors[2]).ShouldNot(HaveOccurred())264 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)265 Ω(errors[3]).Should(MatchError(types.GinkgoErrors.PushingCleanupInReportingNode(cl, types.NodeTypeReportBeforeEach)))266 })267 })268 Context("when pushing a cleanup node in a ReportAfterEach node", func() {269 It("errors", func() {270 var errors = make([]error, 4)271 reportAfterEachNode, _ := internal.NewReportAfterEachNode(func(_ types.SpecReport) {272 errors[3] = suite.PushNode(N(types.NodeTypeCleanupInvalid, cl))273 }, types.NewCodeLocation(0))274 errors[0] = suite.PushNode(N(ntCon, "container", func() {275 errors[1] = suite.PushNode(N(ntIt, "test"))276 errors[2] = suite.PushNode(reportAfterEachNode)277 }))278 Ω(errors[0]).ShouldNot(HaveOccurred())279 Ω(suite.BuildTree()).Should(Succeed())280 Ω(errors[1]).ShouldNot(HaveOccurred())281 Ω(errors[2]).ShouldNot(HaveOccurred())282 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)283 Ω(errors[3]).Should(MatchError(types.GinkgoErrors.PushingCleanupInReportingNode(cl, types.NodeTypeReportAfterEach)))284 })285 })286 Context("when pushing a cleanup node in a ReportAfterSuite node", func() {287 It("errors", func() {288 var errors = make([]error, 4)289 reportAfterSuiteNode, _ := internal.NewReportAfterSuiteNode("report", func(_ types.Report) {290 errors[3] = suite.PushNode(N(types.NodeTypeCleanupInvalid, cl))291 }, types.NewCodeLocation(0))292 errors[0] = suite.PushNode(N(ntCon, "container", func() {293 errors[2] = suite.PushNode(N(ntIt, "test"))294 }))295 errors[1] = suite.PushNode(reportAfterSuiteNode)296 Ω(errors[0]).ShouldNot(HaveOccurred())297 Ω(errors[1]).ShouldNot(HaveOccurred())298 Ω(suite.BuildTree()).Should(Succeed())299 Ω(errors[2]).ShouldNot(HaveOccurred())300 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)301 Ω(errors[3]).Should(MatchError(types.GinkgoErrors.PushingCleanupInReportingNode(cl, types.NodeTypeReportAfterSuite)))302 })303 })304 Context("when pushing a cleanup node within a cleanup node", func() {305 It("errors", func() {306 var errors = make([]error, 3)307 errors[0] = suite.PushNode(N(ntIt, "It", func() {308 cleanupNode, _ := internal.NewCleanupNode(nil, types.NewCustomCodeLocation("outerCleanup"), func() {309 innerCleanupNode, _ := internal.NewCleanupNode(nil, cl, func() {})310 errors[2] = suite.PushNode(innerCleanupNode)311 })312 errors[1] = suite.PushNode(cleanupNode)313 }))314 Ω(errors[0]).ShouldNot(HaveOccurred())315 Ω(suite.BuildTree()).Should(Succeed())316 suite.Run("suite", Labels{}, "/path/to/suite", failer, reporter, writer, outputInterceptor, interruptHandler, client, conf)317 Ω(errors[1]).ShouldNot(HaveOccurred())318 Ω(errors[2]).Should(MatchError(types.GinkgoErrors.PushingCleanupInCleanupNode(cl)))319 })320 })321 })322 Describe("ReportEntries", func() {323 Context("when adding a report entry outside of the run phase", func() {324 It("errors", func() {325 entry, err := internal.NewReportEntry("name", cl)326 Ω(err).ShouldNot(HaveOccurred())327 err = suite.AddReportEntry(entry)328 Ω(err).Should(MatchError(types.GinkgoErrors.AddReportEntryNotDuringRunPhase(cl)))329 suite.BuildTree()330 err = suite.AddReportEntry(entry)331 Ω(err).Should(MatchError(types.GinkgoErrors.AddReportEntryNotDuringRunPhase(cl)))332 })333 })334 })335 When("using when", func() {336 It("prepends 'when' to the test name", func() {337 Ω(CurrentSpecReport().FullText()).Should(ContainSubstring(" when using when prepends"))338 })339 })340 })341})...
math_tree_test.go
Source:math_tree_test.go
1package parser2import (3 "testing"4 "github.com/sarulabs/di/v2"5 "github.com/blkmlk/microshell/internal/logger"6 "github.com/blkmlk/microshell/internal/models"7 "github.com/stretchr/testify/suite"8)9type MathTreeExpressionTestSuite struct {10 suite.Suite11 ctx SystemContext12}13func TestMathTree(t *testing.T) {14 suite.Run(t, new(MathTreeExpressionTestSuite))15}16func (t *MathTreeExpressionTestSuite) SetupTest() {17 builder, err := di.NewBuilder()18 t.Require().NoError(err)19 err = builder.Add(20 Definition,21 DefinitionContext,22 DefinitionScope,23 DefinitionCommandTree,24 logger.Definition,25 )26 t.Require().NoError(err)27 ctn := builder.Build()28 t.ctx = ctn.Get(DefinitionNameRootScope).(SystemContext)29}30func (t *MathTreeExpressionTestSuite) TestMathTree_Add() {31 tree := t.buildTree([]interface{}{"2", OperatorMultiply, "2", OperatorPlus, "2", OperatorMultiply, "3"})32 ctx := t.ctx33 v, err := tree.Value(ctx)34 t.Require().NoError(err)35 t.Require().True(v.IsNumber())36 t.Require().Equal(10, v.Number())37 tree = t.buildTree([]interface{}{"2", OperatorConcatenate, "3"})38 v, err = tree.Value(ctx)39 t.Require().NoError(err)40 t.Require().Equal("23", v.String())41 tree = t.buildTree([]interface{}{"2", OperatorMultiply, "3", OperatorConcatenate, "3"})42 v, err = tree.Value(ctx)43 t.Require().NoError(err)44 t.Require().Equal("63", v.String())45 tree = t.buildTree([]interface{}{"1", OperatorPlus, "3", OperatorConcatenate, "10"})46 v, err = tree.Value(ctx)47 t.Require().NoError(err)48 t.Require().Equal("410", v.String())49 tree = t.buildTree([]interface{}{"1", OperatorPlus, "3", OperatorEqual, "4"})50 v, err = tree.Value(ctx)51 t.Require().NoError(err)52 t.Require().True(v.Bool())53 tree = t.buildTree([]interface{}{"10", OperatorMultiply, "3", OperatorNotEqual, "30"})54 v, err = tree.Value(ctx)55 t.Require().NoError(err)56 t.Require().False(v.Bool())57 tree = t.buildTree([]interface{}{"10", OperatorMultiply, "3", OperatorEqual, "15", OperatorPlus, "20", OperatorMinus, "5"})58 v, err = tree.Value(ctx)59 t.Require().NoError(err)60 t.Require().True(v.Bool())61 tree = t.buildTree([]interface{}{"10", OperatorMultiply, "3", OperatorEqual, "15", OperatorPlus, "20", OperatorMinus, "5"})62 v, err = tree.Value(ctx)63 t.Require().NoError(err)64 t.Require().True(v.Bool())65 tree = t.buildTree([]interface{}{"true", OperatorGreater, "false"})66 _, err = tree.Value(ctx)67 t.Require().Error(err)68 tree = t.buildTree([]interface{}{"true", OperatorNotEqual, "false"})69 v, err = tree.Value(ctx)70 t.Require().NoError(err)71 t.Require().True(v.Bool())72 tree = t.buildTree([]interface{}{OperatorNot, "false"})73 v, err = tree.Value(ctx)74 t.Require().NoError(err)75 t.Require().True(v.Bool())76 tree = t.buildTree([]interface{}{"true", OperatorEqual, OperatorNot, "false"})77 v, err = tree.Value(ctx)78 t.Require().NoError(err)79 t.Require().True(v.Bool())80 tree = t.buildTree([]interface{}{OperatorNot, "true", OperatorEqual, "false"})81 v, err = tree.Value(ctx)82 t.Require().NoError(err)83 t.Require().True(v.Bool())84 tree = t.buildTree([]interface{}{"1", OperatorEqual, "1", OperatorEqual, "true"})85 v, err = tree.Value(ctx)86 t.Require().NoError(err)87 t.Require().True(v.Bool())88 tree = t.buildTree([]interface{}{OperatorNot, OperatorNot, "true"})89 v, err = tree.Value(ctx)90 t.Require().NoError(err)91 t.Require().True(v.Bool())92}93func (t *MathTreeExpressionTestSuite) buildTree(items []interface{}) *mathTree {94 tree := NewMathTree()95 ctx := t.ctx96 for _, i := range items {97 switch t := i.(type) {98 case string:99 exp := NewStdExpression(true)100 for _, c := range t {101 exp.Add(ctx, models.Rune(c))102 }103 tree.Add(exp)104 case Operator:105 tree.Add(t)106 }107 }108 return tree109}...
BuildTree
Using AI Code Generation
1import (2func main() {3 h := &IntHeap{2, 1, 5}4 heap.Init(h)5 heap.Push(h, 3)6 fmt.Printf("minimum: %d7", (*h)[0])8 for h.Len() > 0 {9 fmt.Printf("%d ", heap.Pop(h))10 }11}12func (h IntHeap) Len() int { return len(h) }13func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }14func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }15func (h *IntHeap) Push(x interface{}) {16 *h = append(*h, x.(int))17}18func (h *IntHeap) Pop() interface{} {19 n := len(old)20}21import (22func main() {23 h := &IntHeap{2, 1, 5}24 heap.Init(h)25 heap.Push(h, 3)26 fmt.Printf("minimum: %d27", (*h)[0])28 for h.Len() > 0 {29 fmt.Printf("%d ", heap.Pop(h))30 }31}32func (h IntHeap) Len() int { return len(h) }33func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }34func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }35func (h *IntHeap) Push(x interface{}) {36 *h = append(*h, x.(int))37}38func (h *IntHeap) Pop() interface{} {
BuildTree
Using AI Code Generation
1import "fmt"2func main() {3 tree := BuildTree()4 fmt.Println(tree)5}6func BuildTree() string {7}8func main() {9 tree := BuildTree()10 fmt.Println(tree)11}12func BuildTree() string {13}14import "fmt"15func init() {16 fmt.Println("init1")17}18func init() {19 fmt.Println("init2")20}21func main() {22 fmt.Println("main")23}
BuildTree
Using AI Code Generation
1import (2func main() {3 tree := new(gotree.Tree)4 tree.BuildTree()5 tree.PrintTree()6}7import (8func main() {9 tree := new(gotree.Tree)10 tree.BuildTree()11 tree.PrintTree()12}13If you want to create a package and use it in the same project, then you should create a folder with the same name as the package and put the package files in it. In this case, we have a package called "gotree" and the folder name is also "gotree". So, we can import the package by using the following two ways:14import (15func main() {16 tree := new(gotree.Tree)17 tree.BuildTree()18 tree.PrintTree()19}20import (21func main() {22 tree := new(gotree.Tree)23 tree.BuildTree()24 tree.PrintTree()25}26If you want to create a package and use it in the different project, then you should create a folder with the same name as the package and put the package files in it. In this case, we have a package called "gotree" and the folder name is also "gotree". So, we can import the package by using the following two ways:27import (28func main() {29 tree := new(gotree.Tree)30 tree.BuildTree()31 tree.PrintTree()32}33import (34func main() {35 tree := new(gotree.Tree)36 tree.BuildTree()
BuildTree
Using AI Code Generation
1import (2func main() {3 tree.BuildTree()4}5func BuildTree() {6}
BuildTree
Using AI Code Generation
1import "fmt"2import "github.com/rahul-golang/tree"3func main() {4 tree.BuildTree()5 fmt.Println("Hello, playground")6}7import "fmt"8import "github.com/rahul-golang/tree"9func main() {10 tree.BuildTree()11 fmt.Println("Hello, playground")12}13import "github.com/username/project/internal/models"14func (u *User) DoSomething() {15 u.InternalModel.DoSomething()16}17models/user.go:5: u.InternalModel undefined (type *User has no field or method InternalModel)18import "github.com/username/project/internal/models"19func (u *User) DoSomething() {20 internalmodels.DoSomething()21}22import "github.com/username/project/internal/models"23func (u *User) DoSomething() {24 models.DoSomething()25}26models/user.go:5: models.DoSomething undefined (type *User has no field or method DoSomething)
BuildTree
Using AI Code Generation
1import (2func main() {3 root := tree.BuildTree()4 fmt.Println("Root node is", root)5}6Root node is &{1 0xc00000e0c0 0xc00000e100}7import (8func main() {9 root := tree.BuildTree()10}11import (12func main() {13 root := tree.BuildTree()14}
BuildTree
Using AI Code Generation
1import (2func main() {3 tree := factory.BuildTree(1, 2, 3, 4, 5, 6, 7, 8, 9)4 fmt.Println(tree)5}6import (7func main() {8 tree := factory.BuildTree("one", "two", "three", "four", "five", "six", "seven", "eight", "nine")9 fmt.Println(tree)10}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!