Best Python code snippet using molecule_python
regress.py
Source:regress.py
...686 if _python3:687 return " ".join("0x{0:02x}".format(c) for c in s) # <-- Python 3 is OK688 else:689 return " ".join("0x{0:02x}".format(ord(c)) for c in s)690def str_syntax(syntax):691 slist = {692 0: "",693 CS_OPT_SYNTAX_INTEL: "intel",694 CS_OPT_SYNTAX_ATT: "att",695 }696 return slist[syntax]697def str_arch_mode(a, m):698 amlist = {699 (CS_ARCH_X86, CS_MODE_16): "X86-16bit",700 (CS_ARCH_X86, CS_MODE_32): "X86-32bit",701 (CS_ARCH_X86, CS_MODE_64): "X86-64bit",702 }703 return amlist[(a, m)]704# ## Test cs_disasm_quick()705def test_regression(verbose):706 for (arch, mode, syntax, address, code, expected_output) in all_tests:707 #print("%s %s: %s = " %(str_arch_mode(arch, mode), str_syntax(syntax), to_hex(code)), end=""),708 output = "%s %s: %s = " %(str_arch_mode(arch, mode), str_syntax(syntax), to_hex(code))709 md = Cs(arch, mode)710 if syntax != 0:711 md.syntax = syntax712 insn = list(md.disasm(code, address))[0]713 output2 = "%s %s" % (insn.mnemonic, insn.op_str)714 if output2 != expected_output:715 print(output, output2)716 print("\t --> ERROR: expected output = %s" %(expected_output))717 elif verbose:718 print(output, output2)719if __name__ == '__main__':720 import sys721 if len(sys.argv) == 2 and sys.argv[1] == "-v":722 test_regression(True) # quiet...
test_syntax.py
Source:test_syntax.py
1"""This module tests SyntaxErrors.2Here's an example of the sort of thing that is tested.3>>> def f(x):4... global x5Traceback (most recent call last):6SyntaxError: name 'x' is local and global7The tests are all raise SyntaxErrors. They were created by checking8each C call that raises SyntaxError. There are several modules that9raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and10symtable.c.11The parser itself outlaws a lot of invalid syntax. None of these12errors are tested here at the moment. We should add some tests; since13there are infinitely many programs with invalid syntax, we would need14to be judicious in selecting some.15The compiler generates a synthetic module name for code executed by16doctest. Since all the code comes from the same module, a suffix like17[1] is appended to the module name, As a consequence, changing the18order of tests in this module means renumbering all the errors after19it. (Maybe we should enable the ellipsis option for these tests.)20In ast.c, syntax errors are raised by calling ast_error().21Errors from set_context():22TODO(jhylton): "assignment to None" is inconsistent with other messages23>>> obj.None = 124Traceback (most recent call last):25SyntaxError: assignment to None (<doctest test.test_syntax[1]>, line 1)26>>> None = 127Traceback (most recent call last):28SyntaxError: assignment to None (<doctest test.test_syntax[2]>, line 1)29It's a syntax error to assign to the empty tuple. Why isn't it an30error to assign to the empty list? It will always raise some error at31runtime.32>>> () = 133Traceback (most recent call last):34SyntaxError: can't assign to () (<doctest test.test_syntax[3]>, line 1)35>>> f() = 136Traceback (most recent call last):37SyntaxError: can't assign to function call (<doctest test.test_syntax[4]>, line 1)38>>> del f()39Traceback (most recent call last):40SyntaxError: can't delete function call (<doctest test.test_syntax[5]>, line 1)41>>> a + 1 = 242Traceback (most recent call last):43SyntaxError: can't assign to operator (<doctest test.test_syntax[6]>, line 1)44>>> (x for x in x) = 145Traceback (most recent call last):46SyntaxError: can't assign to generator expression (<doctest test.test_syntax[7]>, line 1)47>>> 1 = 148Traceback (most recent call last):49SyntaxError: can't assign to literal (<doctest test.test_syntax[8]>, line 1)50>>> "abc" = 151Traceback (most recent call last):52SyntaxError: can't assign to literal (<doctest test.test_syntax[9]>, line 1)53>>> `1` = 154Traceback (most recent call last):55SyntaxError: can't assign to repr (<doctest test.test_syntax[10]>, line 1)56If the left-hand side of an assignment is a list or tuple, an illegal57expression inside that contain should still cause a syntax error.58This test just checks a couple of cases rather than enumerating all of59them.60>>> (a, "b", c) = (1, 2, 3)61Traceback (most recent call last):62SyntaxError: can't assign to literal (<doctest test.test_syntax[11]>, line 1)63>>> [a, b, c + 1] = [1, 2, 3]64Traceback (most recent call last):65SyntaxError: can't assign to operator (<doctest test.test_syntax[12]>, line 1)66>>> a if 1 else b = 167Traceback (most recent call last):68SyntaxError: can't assign to conditional expression (<doctest test.test_syntax[13]>, line 1)69From compiler_complex_args():70>>> def f(None=1):71... pass72Traceback (most recent call last):73SyntaxError: assignment to None (<doctest test.test_syntax[14]>, line 1)74From ast_for_arguments():75>>> def f(x, y=1, z):76... pass77Traceback (most recent call last):78SyntaxError: non-default argument follows default argument (<doctest test.test_syntax[15]>, line 1)79>>> def f(x, None):80... pass81Traceback (most recent call last):82SyntaxError: assignment to None (<doctest test.test_syntax[16]>, line 1)83>>> def f(*None):84... pass85Traceback (most recent call last):86SyntaxError: assignment to None (<doctest test.test_syntax[17]>, line 1)87>>> def f(**None):88... pass89Traceback (most recent call last):90SyntaxError: assignment to None (<doctest test.test_syntax[18]>, line 1)91From ast_for_funcdef():92>>> def None(x):93... pass94Traceback (most recent call last):95SyntaxError: assignment to None (<doctest test.test_syntax[19]>, line 1)96From ast_for_call():97>>> def f(it, *varargs):98... return list(it)99>>> L = range(10)100>>> f(x for x in L)101[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]102>>> f(x for x in L, 1)103Traceback (most recent call last):104SyntaxError: Generator expression must be parenthesized if not sole argument (<doctest test.test_syntax[23]>, line 1)105>>> f((x for x in L), 1)106[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]107>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,108... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,109... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,110... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,111... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,112... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,113... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,114... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,115... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,116... i100, i101, i102, i103, i104, i105, i106, i107, i108,117... i109, i110, i111, i112, i113, i114, i115, i116, i117,118... i118, i119, i120, i121, i122, i123, i124, i125, i126,119... i127, i128, i129, i130, i131, i132, i133, i134, i135,120... i136, i137, i138, i139, i140, i141, i142, i143, i144,121... i145, i146, i147, i148, i149, i150, i151, i152, i153,122... i154, i155, i156, i157, i158, i159, i160, i161, i162,123... i163, i164, i165, i166, i167, i168, i169, i170, i171,124... i172, i173, i174, i175, i176, i177, i178, i179, i180,125... i181, i182, i183, i184, i185, i186, i187, i188, i189,126... i190, i191, i192, i193, i194, i195, i196, i197, i198,127... i199, i200, i201, i202, i203, i204, i205, i206, i207,128... i208, i209, i210, i211, i212, i213, i214, i215, i216,129... i217, i218, i219, i220, i221, i222, i223, i224, i225,130... i226, i227, i228, i229, i230, i231, i232, i233, i234,131... i235, i236, i237, i238, i239, i240, i241, i242, i243,132... i244, i245, i246, i247, i248, i249, i250, i251, i252,133... i253, i254, i255)134Traceback (most recent call last):135SyntaxError: more than 255 arguments (<doctest test.test_syntax[25]>, line 1)136The actual error cases counts positional arguments, keyword arguments,137and generator expression arguments separately. This test combines the138three.139>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,140... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,141... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,142... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,143... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,144... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,145... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,146... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,147... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,148... i100, i101, i102, i103, i104, i105, i106, i107, i108,149... i109, i110, i111, i112, i113, i114, i115, i116, i117,150... i118, i119, i120, i121, i122, i123, i124, i125, i126,151... i127, i128, i129, i130, i131, i132, i133, i134, i135,152... i136, i137, i138, i139, i140, i141, i142, i143, i144,153... i145, i146, i147, i148, i149, i150, i151, i152, i153,154... i154, i155, i156, i157, i158, i159, i160, i161, i162,155... i163, i164, i165, i166, i167, i168, i169, i170, i171,156... i172, i173, i174, i175, i176, i177, i178, i179, i180,157... i181, i182, i183, i184, i185, i186, i187, i188, i189,158... i190, i191, i192, i193, i194, i195, i196, i197, i198,159... i199, i200, i201, i202, i203, i204, i205, i206, i207,160... i208, i209, i210, i211, i212, i213, i214, i215, i216,161... i217, i218, i219, i220, i221, i222, i223, i224, i225,162... i226, i227, i228, i229, i230, i231, i232, i233, i234,163... i235, i236, i237, i238, i239, i240, i241, i242, i243,164... (x for x in i244), i245, i246, i247, i248, i249, i250, i251,165... i252=1, i253=1, i254=1, i255=1)166Traceback (most recent call last):167SyntaxError: more than 255 arguments (<doctest test.test_syntax[26]>, line 1)168>>> f(lambda x: x[0] = 3)169Traceback (most recent call last):170SyntaxError: lambda cannot contain assignment (<doctest test.test_syntax[27]>, line 1)171The grammar accepts any test (basically, any expression) in the172keyword slot of a call site. Test a few different options.173>>> f(x()=2)174Traceback (most recent call last):175SyntaxError: keyword can't be an expression (<doctest test.test_syntax[28]>, line 1)176>>> f(a or b=1)177Traceback (most recent call last):178SyntaxError: keyword can't be an expression (<doctest test.test_syntax[29]>, line 1)179>>> f(x.y=1)180Traceback (most recent call last):181SyntaxError: keyword can't be an expression (<doctest test.test_syntax[30]>, line 1)182From ast_for_expr_stmt():183>>> (x for x in x) += 1184Traceback (most recent call last):185SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_syntax[31]>, line 1)186>>> None += 1187Traceback (most recent call last):188SyntaxError: assignment to None (<doctest test.test_syntax[32]>, line 1)189>>> f() += 1190Traceback (most recent call last):191SyntaxError: illegal expression for augmented assignment (<doctest test.test_syntax[33]>, line 1)192Test continue in finally in weird combinations.193continue in for loop under finally shouuld be ok.194 >>> def test():195 ... try:196 ... pass197 ... finally:198 ... for abc in range(10):199 ... continue200 ... print abc201 >>> test()202 9203Start simple, a continue in a finally should not be allowed.204 >>> def test():205 ... for abc in range(10):206 ... try:207 ... pass208 ... finally:209 ... continue210 ...211 Traceback (most recent call last):212 ...213 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[36]>, line 6)214This is essentially a continue in a finally which should not be allowed.215 >>> def test():216 ... for abc in range(10):217 ... try:218 ... pass219 ... finally:220 ... try:221 ... continue222 ... except:223 ... pass224 Traceback (most recent call last):225 ...226 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[37]>, line 7)227 >>> def foo():228 ... try:229 ... pass230 ... finally:231 ... continue232 Traceback (most recent call last):233 ...234 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[38]>, line 5)235 >>> def foo():236 ... for a in ():237 ... try: pass238 ... finally: continue239 Traceback (most recent call last):240 ...241 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[39]>, line 4)242 >>> def foo():243 ... for a in ():244 ... try: pass245 ... finally:246 ... try:247 ... continue248 ... finally: pass249 Traceback (most recent call last):250 ...251 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[40]>, line 6)252 >>> def foo():253 ... for a in ():254 ... try: pass255 ... finally:256 ... try:257 ... pass258 ... except:259 ... continue260 Traceback (most recent call last):261 ...262 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[41]>, line 8)263There is one test for a break that is not in a loop. The compiler264uses a single data structure to keep track of try-finally and loops,265so we need to be sure that a break is actually inside a loop. If it266isn't, there should be a syntax error.267 >>> try:268 ... print 1269 ... break270 ... print 2271 ... finally:272 ... print 3273 Traceback (most recent call last):274 ...275 SyntaxError: 'break' outside loop (<doctest test.test_syntax[42]>, line 3)276This should probably raise a better error than a SystemError (or none at all).277In 2.5 there was a missing exception and an assert was triggered in a debug278build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514279 >>> while 1:280 ... while 2:281 ... while 3:282 ... while 4:283 ... while 5:284 ... while 6:285 ... while 8:286 ... while 9:287 ... while 10:288 ... while 11:289 ... while 12:290 ... while 13:291 ... while 14:292 ... while 15:293 ... while 16:294 ... while 17:295 ... while 18:296 ... while 19:297 ... while 20:298 ... while 21:299 ... while 22:300 ... break301 Traceback (most recent call last):302 ...303 SystemError: too many statically nested blocks304This tests assignment-context; there was a bug in Python 2.5 where compiling305a complex 'if' (one with 'elif') would fail to notice an invalid suite,306leading to spurious errors.307 >>> if 1:308 ... x() = 1309 ... elif 1:310 ... pass311 Traceback (most recent call last):312 ...313 SyntaxError: can't assign to function call (<doctest test.test_syntax[44]>, line 2)314 >>> if 1:315 ... pass316 ... elif 1:317 ... x() = 1318 Traceback (most recent call last):319 ...320 SyntaxError: can't assign to function call (<doctest test.test_syntax[45]>, line 4)321 >>> if 1:322 ... x() = 1323 ... elif 1:324 ... pass325 ... else:326 ... pass327 Traceback (most recent call last):328 ...329 SyntaxError: can't assign to function call (<doctest test.test_syntax[46]>, line 2)330 >>> if 1:331 ... pass332 ... elif 1:333 ... x() = 1334 ... else:335 ... pass336 Traceback (most recent call last):337 ...338 SyntaxError: can't assign to function call (<doctest test.test_syntax[47]>, line 4)339 >>> if 1:340 ... pass341 ... elif 1:342 ... pass343 ... else:344 ... x() = 1345 Traceback (most recent call last):346 ...347 SyntaxError: can't assign to function call (<doctest test.test_syntax[48]>, line 6)348"""349import re350import unittest351import warnings352from test import test_support353class SyntaxTestCase(unittest.TestCase):354 def _check_error(self, code, errtext,355 filename="<testcase>", mode="exec", subclass=None):356 """Check that compiling code raises SyntaxError with errtext.357 errtest is a regular expression that must be present in the358 test of the exception raised. If subclass is specified it359 is the expected subclass of SyntaxError (e.g. IndentationError).360 """361 try:362 compile(code, filename, mode)363 except SyntaxError, err:364 if subclass and not isinstance(err, subclass):365 self.fail("SyntaxError is not a %s" % subclass.__name__)366 mo = re.search(errtext, str(err))367 if mo is None:368 self.fail("SyntaxError did not contain '%r'" % (errtext,))369 else:370 self.fail("compile() did not raise SyntaxError")371 def test_assign_call(self):372 self._check_error("f() = 1", "assign")373 def test_assign_del(self):374 self._check_error("del f()", "delete")375 def test_global_err_then_warn(self):376 # Bug tickler: The SyntaxError raised for one global statement377 # shouldn't be clobbered by a SyntaxWarning issued for a later one.378 source = re.sub('(?m)^ *:', '', """\379 :def error(a):380 : global a # SyntaxError381 :def warning():382 : b = 1383 : global b # SyntaxWarning384 :""")385 warnings.filterwarnings(action='ignore', category=SyntaxWarning)386 self._check_error(source, "global")387 warnings.filters.pop(0)388 def test_break_outside_loop(self):389 self._check_error("break", "outside loop")390 def test_delete_deref(self):391 source = re.sub('(?m)^ *:', '', """\392 :def foo(x):393 : def bar():394 : print x395 : del x396 :""")397 self._check_error(source, "nested scope")398 def test_unexpected_indent(self):399 self._check_error("foo()\n bar()\n", "unexpected indent",400 subclass=IndentationError)401 def test_no_indent(self):402 self._check_error("if 1:\nfoo()", "expected an indented block",403 subclass=IndentationError)404 def test_bad_outdent(self):405 self._check_error("if 1:\n foo()\n bar()",406 "unindent does not match .* level",407 subclass=IndentationError)408 def test_kwargs_last(self):409 self._check_error("int(base=10, '2')", "non-keyword arg")410def test_main():411 test_support.run_unittest(SyntaxTestCase)412 from test import test_syntax413 test_support.run_doctest(test_syntax, verbosity=True)414if __name__ == "__main__":...
visitor.py
Source:visitor.py
1from pyjsparser.pyjsparserdata import Syntax2_binary = lambda n: [n['left'], n['right']]3_function = lambda n: n['params'] + n['defaults'] + [n['body']]4# yields children in visitation order5_children = {6 Syntax.ArrayExpression: lambda n: n['elements'],7 Syntax.ArrayPattern: lambda n: n['elements'],8 Syntax.ArrowFunctionExpression: _function,9 Syntax.AssignmentExpression: _binary,10 Syntax.AssignmentPattern: _binary,11 Syntax.BinaryExpression: _binary,12 Syntax.BlockStatement: lambda n: n['body'],13 Syntax.BreakStatement: lambda n: [],14 Syntax.CallExpression: lambda n: [n['callee']] + n['arguments'],15 Syntax.CatchClause: lambda n: [n['param'], n['body']],16 Syntax.ClassBody: lambda n: [n['body']],17 Syntax.ClassDeclaration: lambda n: [n['superClass'], n['body']],18 Syntax.ClassExpression: lambda n: [n['superClass'], n['body']],19 Syntax.ConditionalExpression: lambda n: [n['test'], n['consequent'], n['alternate']],20 Syntax.ContinueStatement: lambda n: [],21 Syntax.DebuggerStatement: lambda n: [],22 Syntax.DoWhileStatement: lambda n: [n['body'], n['test']],23 Syntax.EmptyStatement: lambda n: [],24 Syntax.ExportAllDeclaration: lambda n: [n['source']],25 Syntax.ExportDefaultDeclaration: lambda n: [n['declaration']],26 Syntax.ExportNamedDeclaration: lambda n: ([n['declaration']] if n['declaration'] else n['specifiers']) + [n['source']],27 Syntax.ExportSpecifier: lambda n: [n['local'], n['exported']],28 Syntax.ExpressionStatement: lambda n: [n['expression']],29 Syntax.ForStatement: lambda n: [n['init'], n['test'], n['update'], n['body']],30 Syntax.ForInStatement: lambda n: [n['left'], n['right'], n['body']],31 Syntax.FunctionDeclaration: _function,32 Syntax.FunctionExpression: _function,33 Syntax.Identifier: lambda n: [],34 Syntax.IfStatement: lambda n: [n['test'], n['consequent'], n['alternate']],35 Syntax.ImportDeclaration: lambda n: n['specifiers'] + [n['source']],36 Syntax.ImportDefaultSpecifier: lambda n: [n['local']],37 Syntax.ImportNamespaceSpecifier: lambda n: [n['local']],38 Syntax.ImportSpecifier: lambda n: [n['local'], n['imported']],39 Syntax.LabeledStatement: lambda n: [n['body']],40 Syntax.Literal: lambda n: [],41 Syntax.LogicalExpression: _binary,42 Syntax.MemberExpression: lambda n: [n['object'], n['property']],43 #Syntax.MethodDefinition: lambda n: [],44 Syntax.NewExpression: lambda n: [n['callee']] + n['arguments'],45 Syntax.ObjectExpression: lambda n: n['properties'],46 Syntax.ObjectPattern: lambda n: n['properties'],47 Syntax.Program: lambda n: n['body'],48 Syntax.Property: lambda n: [n['key'], n['value']],49 Syntax.RestElement: lambda n: [n['argument']],50 Syntax.ReturnStatement: lambda n: [n['argument']],51 Syntax.SequenceExpression: lambda n: n['expressions'],52 Syntax.SpreadElement: lambda n: [n['argument']],53 Syntax.Super: lambda n: [],54 Syntax.SwitchCase: lambda n: [n['test'], n['consequent']],55 Syntax.SwitchStatement: lambda n: [n['discriminant']] + n['cases'],56 Syntax.TaggedTemplateExpression: lambda n: [n['tag'], n['quasi']],57 Syntax.TemplateElement: lambda n: [],58 Syntax.TemplateLiteral: lambda n: n['quasis'] + n['expressions'],59 Syntax.ThisExpression: lambda n: [],60 Syntax.ThrowStatement: lambda n: [n['argument']],61 Syntax.TryStatement: lambda n: [n['block'], n['handler'], n['finalizer']],62 Syntax.UnaryExpression: lambda n: [n['argument']],63 Syntax.UpdateExpression: lambda n: [n['argument']],64 Syntax.VariableDeclaration: lambda n: n['declarations'],65 Syntax.VariableDeclarator: lambda n: [n['id'], n['init']],66 Syntax.WhileStatement: lambda n: [n['test'], n['body']],67 Syntax.WithStatement: lambda n: [n['object'], n['body']],68}69SKIP = object()70class Visitor(object):71 """72 Generic visitor for the pyjsparser AST.73 Visitation is driven by the ``visit`` method, which iterates the tree in74 depth-first pre-order.75 For each node, calls ``enter_$NODETYPE``, visits the children then calls76 ``exit_$NODETYPE``. If the enter or exit methods are not present on the77 visitor, falls back on ``enter_generic`` and ``exit_generic``.78 Any ``enter_`` method can return ``SKIP`` to suppress both the traversal79 of the subtree *and* the call to the corresponding ``exit_`` method80 (whether generic or specific).81 For convenience, ``visit`` will return whatever is set as the visitor's82 ``result`` attribute, ``None`` by default.83 ``visit`` can be given multiple root nodes, and it can be called multiple84 times. The ``result`` attribute is cleared at each call but not between85 two roots of the same ``visit`` call.86 """87 def __init__(self):88 super(Visitor, self).__init__()89 self.result = None90 def enter_generic(self, node): pass91 def exit_generic(self, node): pass92 def visit(self, nodes):93 if isinstance(nodes, dict):94 nodes = [nodes]95 # if multiple nodes are passed in, we need to reverse the order in96 # order to traverse front-to-back rather than the other way around97 nodes = list(reversed(nodes))98 while nodes:99 node = nodes.pop()100 # should probably filter None descendants in _children...101 if node is None:102 continue103 node_type = node['type']104 if node_type == '_exit':105 node = node['node']106 getattr(self, 'exit_' + node['type'], self.exit_generic)(node)107 continue108 if getattr(self, 'enter_' + node_type, self.enter_generic)(node) is SKIP:109 continue110 nodes.append({'type': '_exit', 'node': node})111 nodes.extend(reversed(_children[node_type](node)))...
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!!