How to use _read_log method in lisa

Best Python code snippet using lisa_python

test_list.py

Source:test_list.py Github

copy

Full Screen

...231 def _notebook_content(self):232 reference_file = self.files_path / 'test.ipynb'233 with open(reference_file, 'rb') as file:234 return file.read()235 def _read_log(self):236 log_records = [237 '[{}] {}\n'.format(x.levelname, x.getMessage())238 for x in self.caplog.records239 ]240 self.caplog.clear()241 return ''.join(log_records)242 def _submit(243 self,244 course_id=TestExchange.course_id,245 assignment_id=TestExchange.assignment_id,246 timestamp=timestamp1,247 ):248 assignment_filename = '{}+{}+{}'.format(249 self.student_id, assignment_id, timestamp250 )251 notebook_path = (252 self.cache_dir253 / course_id254 / assignment_filename255 / (self.notebook_id + '.ipynb')256 )257 timestamp_path = notebook_path.parent / 'timestamp.txt'258 notebook_path.parent.mkdir(parents=True)259 shutil.copyfile(self.files_path / 'test.ipynb', notebook_path)260 with open(timestamp_path, 'w') as timestamp_file:261 timestamp_file.write(timestamp)262 @pytest.fixture(autouse=True)263 def init_submit(264 self, caplog: LogCaptureFixture, tmpdir_factory: TempdirFactory265 ):266 self.caplog = caplog267 self.course_dir2 = Path(268 tmpdir_factory.mktemp(self.course_id2)269 ).absolute()270 self._mock_requests_list()271 self.list = self._new_list()272 os.chdir(self.course_dir)273 self.caplog.set_level(logging.INFO)274 self.list.coursedir.course_id = '*'275 self.list.coursedir.assignment_id = '*'276 self.num_courses = 1277 self.num_assignments = 0278 self.num_submissions = 0279 self.num_feedback = 0280 self.is_instructor = True281 def test_404(self):282 self.mock_404()283 try:284 self.list.start()285 except Exception as e:286 assert issubclass(type(e), ExchangeError)287 def test_unsuccessful(self):288 self.mock_unsuccessful()289 try:290 self.list.start()291 except Exception as e:292 assert issubclass(type(e), ExchangeError)293 def test_list_by_student_id_1(self):294 self.num_courses = 2295 self.num_assignments = 1296 self.list.coursedir.course_id = self.course_id297 self.list.coursedir.student_id = self.student_id298 self.list.inbound = True299 self.list.start()300 def test_list_by_student_id_2(self):301 self.num_courses = 2302 self.num_assignments = 1303 self.list.coursedir.course_id = self.course_id304 self.list.coursedir.student_id = ''305 self.list.inbound = True306 self.list.start()307 def test_list_released_2x1_course1(self):308 self.num_courses = 2309 self.num_assignments = 1310 self.list.coursedir.course_id = self.course_id311 self.list.start()312 output = self._read_log()313 assert (314 output315 == dedent(316 """317 [INFO] Released assignments:318 [INFO] {} {}319 """320 )321 .lstrip()322 .format(self.course_id, self.assignment_id)323 )324 def test_list_released_2x1_course2(self):325 self.num_courses = 2326 self.num_assignments = 1327 self.list.coursedir.course_id = self.course_id2328 self.list.start()329 output = self._read_log()330 assert (331 output332 == dedent(333 """334 [INFO] Released assignments:335 [INFO] {} {}336 """337 )338 .lstrip()339 .format(self.course_id2, self.assignment_id)340 )341 def test_list_released_2x1(self):342 self.num_courses = 2343 self.num_assignments = 1344 self.list.coursedir.course_id = '*'345 self.list.start()346 output = self._read_log()347 assert output == dedent(348 """349 [INFO] Released assignments:350 [INFO] {} {}351 [INFO] {} {}352 """353 ).lstrip().format(354 self.course_id,355 self.assignment_id,356 self.course_id2,357 self.assignment_id,358 )359 def test_list_released_2x2_assignment1(self):360 self.num_courses = 2361 self.num_assignments = 2362 self.list.coursedir.assignment_id = self.assignment_id363 self.list.start()364 output = self._read_log()365 assert output == dedent(366 """367 [INFO] Released assignments:368 [INFO] {} {}369 [INFO] {} {}370 """371 ).lstrip().format(372 self.course_id,373 self.assignment_id,374 self.course_id2,375 self.assignment_id,376 )377 def test_list_released_2x2_assignment2(self):378 self.num_courses = 2379 self.num_assignments = 2380 self.list.coursedir.assignment_id = self.assignment_id2381 self.list.start()382 output = self._read_log()383 assert output == dedent(384 """385 [INFO] Released assignments:386 [INFO] {} {}387 [INFO] {} {}388 """389 ).lstrip().format(390 self.course_id,391 self.assignment_id2,392 self.course_id2,393 self.assignment_id2,394 )395 def test_list_released_2x2(self):396 self.num_courses = 2397 self.num_assignments = 2398 self.list.start()399 output = self._read_log()400 assert output == dedent(401 """402 [INFO] Released assignments:403 [INFO] {} {}404 [INFO] {} {}405 [INFO] {} {}406 [INFO] {} {}407 """408 ).lstrip().format(409 self.course_id,410 self.assignment_id,411 self.course_id,412 self.assignment_id2,413 self.course_id2,414 self.assignment_id,415 self.course_id2,416 self.assignment_id2,417 )418 def test_list_fetched(self):419 self.num_assignments = 2420 self._fetch(self.course_dir)421 self.list.start()422 output = self._read_log()423 assert output == dedent(424 """425 [INFO] Released assignments:426 [INFO] {} {} (already downloaded)427 [INFO] {} {}428 """429 ).lstrip().format(430 self.course_id,431 self.assignment_id,432 self.course_id,433 self.assignment_id2,434 )435 def test_list_remove_inbound(self):436 self.num_assignments = 2437 self.list.coursedir.assignment_id = self.assignment_id438 self.list.inbound = True439 self.list.remove = True440 self.list.start()441 assert not self.test_failed442 assert not self.test_completed443 def test_list_remove_outbound(self):444 self.num_assignments = 2445 self.list.coursedir.assignment_id = self.assignment_id446 self.list.remove = True447 self.list.start()448 assert not self.test_failed449 assert self.test_completed450 def test_list_inbound_0(self):451 self.num_assignments = 1452 self.num_submissions = 0453 self.list.coursedir.assignment_id = self.assignment_id454 self.list.inbound = True455 self.list.start()456 assert (457 self._read_log()458 == dedent(459 """460 [INFO] Submitted assignments:461 """462 ).lstrip()463 )464 def test_list_inbound_1(self):465 self.num_assignments = 1466 self.num_submissions = 1467 self.list.coursedir.assignment_id = self.assignment_id468 self.list.inbound = True469 self.list.start()470 assert self._read_log() == dedent(471 """472 [INFO] Submitted assignments:473 [INFO] {} {} {} {} (no feedback available)474 """475 ).lstrip().format(476 self.course_id,477 self.student_id,478 self.assignment_id,479 self.timestamp1,480 )481 def test_list_inbound_2(self):482 self.num_assignments = 1483 self.num_submissions = 2484 self.list.coursedir.assignment_id = self.assignment_id485 self.list.inbound = True486 self.list.start()487 assert self._read_log() == dedent(488 """489 [INFO] Submitted assignments:490 [INFO] {} {} {} {} (no feedback available)491 [INFO] {} {} {} {} (no feedback available)492 """493 ).lstrip().format(494 self.course_id,495 self.student_id,496 self.assignment_id,497 self.timestamp1,498 self.course_id,499 self.student_id,500 self.assignment_id,501 self.timestamp2,502 )503 def test_list_inbound_no_notebooks(self):504 self._mock_no_notebook()505 self.num_assignments = 1506 self.num_submissions = 1507 self.list.coursedir.assignment_id = self.assignment_id508 self.list.inbound = True509 self.list.start()510 assert self._read_log() == dedent(511 """512 [WARNING] No notebooks found for assignment "{}" in course "{}"513 [INFO] Submitted assignments:514 [INFO] {} {} {} {} (no feedback available)515 """516 ).lstrip().format(517 self.assignment_id,518 self.course_id,519 self.course_id,520 self.student_id,521 self.assignment_id,522 self.timestamp1,523 )524 def test_list_cached_0(self):525 self.num_assignments = 1526 self.is_instructor = False527 self.list.cached = True528 self.list.coursedir.assignment_id = self.assignment_id529 self.list.start()530 assert (531 self._read_log()532 == dedent(533 """534 [INFO] Submitted assignments:535 """536 ).lstrip()537 )538 def test_list_cached_1(self):539 self.num_assignments = 1540 self._submit()541 self.is_instructor = False542 self.list.cached = True543 self.list.coursedir.assignment_id = self.assignment_id544 self.list.start()545 assert self._read_log() == dedent(546 """547 [INFO] Submitted assignments:548 [INFO] {} {} {} {} (no feedback available)549 """550 ).lstrip().format(551 self.course_id,552 self.student_id,553 self.assignment_id,554 self.timestamp1,555 )556 def test_list_cached_2(self):557 self.num_assignments = 1558 self._submit()559 self._submit(timestamp=self.timestamp2)560 self.is_instructor = False561 self.list.cached = True562 self.list.coursedir.assignment_id = self.assignment_id563 self.list.start()564 assert self._read_log() == dedent(565 """566 [INFO] Submitted assignments:567 [INFO] {} {} {} {} (no feedback available)568 [INFO] {} {} {} {} (no feedback available)569 """570 ).lstrip().format(571 self.course_id,572 self.student_id,573 self.assignment_id,574 self.timestamp1,575 self.course_id,576 self.student_id,577 self.assignment_id,578 self.timestamp2,579 )580 def test_list_not_in_course(self):581 tester = self582 class DummyAuthenticator(Authenticator):583 def get_student_courses(self, student_id):584 return [tester.course_id2]585 self.num_courses = 2586 self.num_assignments = 1587 self.list.coursedir.course_id = self.course_id588 self.list.authenticator = DummyAuthenticator()589 self.list.start()590 def test_list_remove_cached(self):591 self._submit()592 self._submit(593 assignment_id=self.assignment_id2, timestamp=self.timestamp2594 )595 self.is_instructor = False596 self.list.cached = True597 self.list.remove = True598 self.list.coursedir.assignment_id = self.assignment_id599 self.list.start()600 self._read_log()601 self.list.remove = False602 self.list.coursedir.assignment_id = '*'603 self.list.start()604 assert self._read_log() == dedent(605 """606 [INFO] Submitted assignments:607 [INFO] {} {} {} {} (no feedback available)608 """609 ).lstrip().format(610 self.course_id,611 self.student_id,612 self.assignment_id2,613 self.timestamp2,614 )615 def test_list_cached_and_inbound(self):616 self.is_instructor = False617 self.list.cached = True618 self.list.inbound = True619 with pytest.raises(ExchangeError):620 self.list.start()621 def test_list_feedback_inbound_ready1(self):622 self.num_assignments = 1623 self.num_submissions = 2624 self.num_feedback = 1625 self.list.inbound = True626 self.list.coursedir.assignment_id = self.assignment_id627 self.list.start()628 assert self._read_log() == dedent(629 """630 [INFO] Submitted assignments:631 [INFO] {} {} {} {} (feedback ready to be fetched)632 [INFO] {} {} {} {} (no feedback available)633 """634 ).lstrip().format(635 self.course_id,636 self.student_id,637 self.assignment_id,638 self.timestamp1,639 self.course_id,640 self.student_id,641 self.assignment_id,642 self.timestamp2,643 )644 def test_list_feedback_inbound_fetched1(self):645 self.num_assignments = 1646 self.num_submissions = 2647 self.num_feedback = 1648 self.list.inbound = True649 self.list.coursedir.assignment_id = self.assignment_id650 self._fetch_feedback(651 self.course_dir, self.course_id, self.assignment_id, self.timestamp1652 )653 self.list.start()654 assert self._read_log() == dedent(655 """656 [INFO] Submitted assignments:657 [INFO] {} {} {} {} (feedback already fetched)658 [INFO] {} {} {} {} (no feedback available)659 """660 ).lstrip().format(661 self.course_id,662 self.student_id,663 self.assignment_id,664 self.timestamp1,665 self.course_id,666 self.student_id,667 self.assignment_id,668 self.timestamp2,669 )670 def test_list_feedback_inbound_modified1(self):671 self.num_assignments = 1672 self.num_submissions = 2673 self.num_feedback = 1674 self.list.inbound = True675 self.list.coursedir.assignment_id = self.assignment_id676 self._fetch_feedback(677 self.course_dir, self.course_id, self.assignment_id, self.timestamp1678 )679 feedback_path = (680 self.course_dir681 / self.assignment_id682 / 'feedback'683 / self.timestamp1684 / (self.notebook_id + '.html')685 )686 # This part is different from the original test because the fetched687 # feedback is modified instead of the outbound one, but the results688 # should be the same.689 with open(feedback_path, 'a') as fetched_file:690 fetched_file.write('blahblahblah')691 self.list.start()692 assert self._read_log() == dedent(693 """694 [INFO] Submitted assignments:695 [INFO] {} {} {} {} (feedback ready to be fetched)696 [INFO] {} {} {} {} (no feedback available)697 """698 ).lstrip().format(699 self.course_id,700 self.student_id,701 self.assignment_id,702 self.timestamp1,703 self.course_id,704 self.student_id,705 self.assignment_id,706 self.timestamp2,707 )708 def test_list_feedback_inbound_modified1_ready1(self):709 self.num_assignments = 1710 self.num_submissions = 2711 self.num_feedback = 1712 self.list.inbound = True713 self.list.coursedir.assignment_id = self.assignment_id714 self._fetch_feedback(715 self.course_dir, self.course_id, self.assignment_id, self.timestamp1716 )717 feedback_path = (718 self.course_dir719 / self.assignment_id720 / 'feedback'721 / self.timestamp1722 / (self.notebook_id + '.html')723 )724 with open(feedback_path, 'a') as fetched_file:725 fetched_file.write('blahblahblah')726 self.num_feedback = 2727 self.list.start()728 assert self._read_log() == dedent(729 """730 [INFO] Submitted assignments:731 [INFO] {} {} {} {} (feedback ready to be fetched)732 [INFO] {} {} {} {} (feedback ready to be fetched)733 """734 ).lstrip().format(735 self.course_id,736 self.student_id,737 self.assignment_id,738 self.timestamp1,739 self.course_id,740 self.student_id,741 self.assignment_id,742 self.timestamp2,743 )744 def test_list_feedback_inbound_fetched2(self):745 self.num_assignments = 1746 self.num_submissions = 2747 self.num_feedback = 1748 self.list.inbound = True749 self.list.coursedir.assignment_id = self.assignment_id750 self._fetch_feedback(751 self.course_dir, self.course_id, self.assignment_id, self.timestamp1752 )753 self._fetch_feedback(754 self.course_dir, self.course_id, self.assignment_id, self.timestamp2755 )756 self.num_feedback = 2757 self.list.start()758 assert self._read_log() == dedent(759 """760 [INFO] Submitted assignments:761 [INFO] {} {} {} {} (feedback already fetched)762 [INFO] {} {} {} {} (feedback already fetched)763 """764 ).lstrip().format(765 self.course_id,766 self.student_id,767 self.assignment_id,768 self.timestamp1,769 self.course_id,770 self.student_id,771 self.assignment_id,772 self.timestamp2,773 )774 def test_list_feedback_cached_ready1(self):775 self.num_assignments = 1776 self.num_submissions = 2777 self.num_feedback = 1778 self._submit()779 self._submit(timestamp=self.timestamp2)780 self.is_instructor = False781 self.list.cached = True782 self.list.coursedir.assignment_id = self.assignment_id783 self.list.start()784 assert self._read_log() == dedent(785 """786 [INFO] Submitted assignments:787 [INFO] {} {} {} {} (feedback ready to be fetched)788 [INFO] {} {} {} {} (no feedback available)789 """790 ).lstrip().format(791 self.course_id,792 self.student_id,793 self.assignment_id,794 self.timestamp1,795 self.course_id,796 self.student_id,797 self.assignment_id,798 self.timestamp2,799 )800 def test_list_feedback_cached_fetched1(self):801 self.num_assignments = 1802 self.num_submissions = 2803 self.num_feedback = 1804 self._submit()805 self._submit(timestamp=self.timestamp2)806 self._fetch_feedback(807 self.course_dir, self.course_id, self.assignment_id, self.timestamp1808 )809 self.is_instructor = False810 self.list.cached = True811 self.list.coursedir.assignment_id = self.assignment_id812 self.list.start()813 assert self._read_log() == dedent(814 """815 [INFO] Submitted assignments:816 [INFO] {} {} {} {} (feedback already fetched)817 [INFO] {} {} {} {} (no feedback available)818 """819 ).lstrip().format(820 self.course_id,821 self.student_id,822 self.assignment_id,823 self.timestamp1,824 self.course_id,825 self.student_id,826 self.assignment_id,827 self.timestamp2,828 )829 def test_list_feedback_cached_modified1(self):830 self.num_assignments = 1831 self.num_submissions = 2832 self.num_feedback = 1833 self._submit()834 self._submit(timestamp=self.timestamp2)835 self._fetch_feedback(836 self.course_dir, self.course_id, self.assignment_id, self.timestamp1837 )838 self.is_instructor = False839 self.list.cached = True840 self.list.coursedir.assignment_id = self.assignment_id841 feedback_path = (842 self.course_dir843 / self.assignment_id844 / 'feedback'845 / self.timestamp1846 / (self.notebook_id + '.html')847 )848 # This part is different from the original test because the fetched849 # feedback is modified instead of the outbound one, but the results850 # should be the same.851 with open(feedback_path, 'a') as fetched_file:852 fetched_file.write('blahblahblah')853 self.list.start()854 assert self._read_log() == dedent(855 """856 [INFO] Submitted assignments:857 [INFO] {} {} {} {} (feedback ready to be fetched)858 [INFO] {} {} {} {} (no feedback available)859 """860 ).lstrip().format(861 self.course_id,862 self.student_id,863 self.assignment_id,864 self.timestamp1,865 self.course_id,866 self.student_id,867 self.assignment_id,868 self.timestamp2,869 )870 def test_list_feedback_cached_ready2(self):871 self.num_assignments = 1872 self.num_submissions = 2873 self.num_feedback = 1874 self._submit()875 self._submit(timestamp=self.timestamp2)876 self._fetch_feedback(877 self.course_dir, self.course_id, self.assignment_id, self.timestamp1878 )879 self.is_instructor = False880 self.list.cached = True881 self.list.coursedir.assignment_id = self.assignment_id882 feedback_path = (883 self.course_dir884 / self.assignment_id885 / 'feedback'886 / self.timestamp1887 / (self.notebook_id + '.html')888 )889 with open(feedback_path, 'a') as fetched_file:890 fetched_file.write('blahblahblah')891 self.num_feedback = 2892 self.list.start()893 assert self._read_log() == dedent(894 """895 [INFO] Submitted assignments:896 [INFO] {} {} {} {} (feedback ready to be fetched)897 [INFO] {} {} {} {} (feedback ready to be fetched)898 """899 ).lstrip().format(900 self.course_id,901 self.student_id,902 self.assignment_id,903 self.timestamp1,904 self.course_id,905 self.student_id,906 self.assignment_id,907 self.timestamp2,908 )909 def test_list_feedback_cached_fetched2(self):910 self.num_assignments = 1911 self.num_submissions = 2912 self.num_feedback = 1913 self._submit()914 self._submit(timestamp=self.timestamp2)915 self._fetch_feedback(916 self.course_dir, self.course_id, self.assignment_id, self.timestamp1917 )918 self._fetch_feedback(919 self.course_dir, self.course_id, self.assignment_id, self.timestamp2920 )921 self.is_instructor = False922 self.list.cached = True923 self.list.coursedir.assignment_id = self.assignment_id924 self.num_feedback = 2925 self.list.start()926 assert self._read_log() == dedent(927 """928 [INFO] Submitted assignments:929 [INFO] {} {} {} {} (feedback already fetched)930 [INFO] {} {} {} {} (feedback already fetched)931 """932 ).lstrip().format(933 self.course_id,934 self.student_id,935 self.assignment_id,936 self.timestamp1,937 self.course_id,938 self.student_id,939 self.assignment_id,940 self.timestamp2,...

Full Screen

Full Screen

controller.py

Source:controller.py Github

copy

Full Screen

1import urwid2import threading3from lcm_mon.core import *4from lcm_mon.network import *5from lcm_mon.util import *6def parse_command(command_string, current_state):7 args = command_string.split()8 if args[0] == ":q" or args[0] == ":quit":9 return "quit", []10 elif args[0] == ":l" or args[0] == ":log":11 if current_state._write_log is None or not current_state._write_log.is_open():12 if len(args) == 1:13 filename = None14 elif len(args) == 2:15 filename = args[1]16 else:17 return None, []18 return "start_write_log", [filename]19 else:20 return "stop_write_log", []21 elif args[0] == ":play" or args[0] == ":p":22 if current_state._read_log is None:23 if len(args) == 2:24 return "start_read_log", [args[1], None]25 elif len(args) == 3 and is_float(args[2]):26 return "start_read_log", [args[1], float(args[2])]27 else:28 return None, []29 elif len(args) == 2 and is_float(args[1]):30 speed = float(args[1])31 return "set_playback_speed", [speed]32 elif len(args) == 1:33 if current_state._read_log.is_playing():34 return "pause_read_log", []35 else:36 return "resume_read_log", []37 else:38 return None, []39 elif args[0] == ":pause":40 if current_state._read_log is not None:41 if current_state._read_log.is_playing():42 return "pause_read_log", []43 else:44 return None, []45 else:46 return None, []47 elif args[0] == ":s" or args[0] == ":seek":48 if current_state._read_log is not None:49 if len(args) == 2 and is_float(args[1]):50 if args[1][0] == "+" or args[1][0] == "-":51 seek_time = current_state._read_log.position() + float(args[1])52 else:53 seek_time = float(args[1])54 return "seek_read_log", [seek_time]55 else:56 return None, []57 else:58 return None, []59 elif args[0] == ":r" or args[0] == ":refresh":60 if len(args) == 2 and is_float(args[1]):61 rate = float(args[1])62 return "set_refresh_rate", [rate]63 else:64 return None, []65 elif args[0] == ":v" or args[0] == ":view":66 if len(args) == 2 and args[1] == "-":67 return "stop_visualize", []68 else:69 return "visualize", []70 elif args[0] == ":c" or args[0] == ":clear":71 return "clear", []72 else:73 return None, []74def run_command(command, state, status, node, table, data_table, visualizer):75 action, args = parse_command(command, state)76 if action == "quit":77 raise urwid.ExitMainLoop()78 return True79 elif action == "start_write_log":80 if args[0] is None:81 _, path = tempfile.mkstemp(prefix="lcmlog-", dir=".")82 else:83 path = args[0]84 state.lock()85 state._write_log = WriteLog(path)86 state.unlock()87 status.set(write=state._write_log)88 elif action == "stop_write_log":89 state.lock()90 state._write_log.close()91 status.set(write=state._write_log)92 state.unlock()93 elif action == "start_read_log":94 if args[1] is None:95 state._read_log = ReadLog(args[0])96 else:97 state._read_log = ReadLog(args[0], playback_speed=args[1])98 status.set(read=state._read_log)99 def play_callback():100 state._read_log = None101 status.set(read=None)102 read_log_thread = threading.Thread(target=play_log,103 args=(node, state._read_log, play_callback))104 read_log_thread.setDaemon(True)105 read_log_thread.start()106 elif action == "set_playback_speed":107 state._read_log.set_playback_speed(args[0])108 elif action == "pause_read_log":109 state._read_log.pause()110 elif action == "resume_read_log":111 state._read_log.resume()112 elif action == "seek_read_log":113 state._read_log.seek_to_time(args[0])114 elif action == "set_refresh_rate":115 state._refresh_rate = args[0]116 status.set(refresh=args[0])117 elif action == "visualize":118 table.lock()119 data_table.lock()120 channels_entry = table.selected_entry()121 data_entry = data_table.selected_entry()122 if channels_entry is not None and data_entry is not None:123 channel = channels_entry[0]124 variable = data_entry[0]125 if (channel, variable) in visualizer.tags():126 visualizer.stop()127 else:128 time = channels_entry[2]129 value = data_entry[1]130 visualizer.update((channel, variable), time, value)131 data_table.unlock()132 table.unlock()133 elif action == "stop_visualize":134 visualizer.stop()135 elif action == "clear":136 state.lock()137 table.lock()138 table.clear()139 table.flush()140 table.unlock()141 data_table.lock()142 data_table.clear()143 data_table.flush()144 data_table.unlock()145 if state._write_log is None or not state._write_log.is_open():146 state._write_log = None147 status.set(write=state._write_log)148 state.unlock()149 else:...

Full Screen

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run lisa automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful