How to use formatter method of com.tngtech.jgiven.report.model.TableAnnotation class

Best JGiven code snippet using com.tngtech.jgiven.report.model.TableAnnotation.formatter

Source:DataTableFormatterTest.java Github

copy

Full Screen

1package com.tngtech.jgiven.report.model;2import static com.google.common.collect.Lists.newArrayList;3import static org.assertj.core.api.Assertions.assertThat;4import java.lang.annotation.Annotation;5import java.util.ArrayList;6import java.util.Arrays;7import java.util.List;8import org.junit.Test;9import org.junit.runner.RunWith;10import com.tngtech.java.junit.dataprovider.DataProvider;11import com.tngtech.java.junit.dataprovider.DataProviderRunner;12import com.tngtech.jgiven.DataTables;13import com.tngtech.jgiven.annotation.Table;14import com.tngtech.jgiven.config.FormatterConfiguration;15import com.tngtech.jgiven.exception.JGivenWrongUsageException;16import com.tngtech.jgiven.format.DefaultFormatter;17import com.tngtech.jgiven.format.Formatter;18import com.tngtech.jgiven.format.ObjectFormatter;19import com.tngtech.jgiven.format.table.DefaultTableFormatter;20import com.tngtech.jgiven.format.table.RowFormatter;21import com.tngtech.jgiven.format.table.RowFormatterFactory;22@RunWith( DataProviderRunner.class )23public class DataTableFormatterTest {24 private static final Object[][] TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS =25 { { "h1", "h2" }, { "a1", "a2" }, { "b1", "b2" } };26 static class TestPojo {27 int x = 5;28 int y = 6;29 @Override30 public String toString() {31 return "TestPojo: " + x + ", " + y;32 }33 }34 static class AnotherPojo {35 String fieldA = "test";36 String fieldB = "testB";37 }38 @Test39 public void testToTableValue() {40 // has neither rows nor columns41 assertThat( toTableValue( new Object[][] { }, new TableAnnotation() ).getData() ).isEmpty();42 // no columns43 assertThat( toTableValue( new Object[][] { { } }, new TableAnnotation() ).getData() ).hasSize( 1 );44 try {45 // rows with non-collection type46 toTableValue( new Object[] { new Object[] { }, 5 }, new TableAnnotation() );47 assertThat( false ).as( "Exception should have been thrown" ).isTrue();48 } catch( JGivenWrongUsageException e ) {49 }50 try {51 // not the same column number in all rows52 toTableValue( new Object[][] { { 1, 2 }, { 1 } }, new TableAnnotation() );53 assertThat( false ).as( "Exception should have been thrown" ).isTrue();54 } catch( JGivenWrongUsageException e ) {55 }56 // single POJO57 assertThat( toTableValue( new TestPojo(), new TableAnnotation() ).getData() )58 .containsExactly( Arrays.asList( "x", "y" ), Arrays.asList( "5", "6" ) );59 // single POJO without null values60 TableAnnotation tableAnnotation = new TableAnnotation();61 tableAnnotation.includeNullColumns = true;62 assertThat( toTableValue( new AnotherPojo(), tableAnnotation ).getData() )63 .containsExactly( Arrays.asList( "fieldA", "fieldB" ), Arrays.asList( "test", "testB" ) );64 // single POJO with null values65 AnotherPojo withNull = new AnotherPojo();66 withNull.fieldB = null;67 assertThat( toTableValue( withNull, new TableAnnotation() ).getData() )68 .containsExactly( Arrays.asList( "fieldA" ), Arrays.asList( "test" ) );69 // single POJO with exclusion filter70 tableAnnotation = new TableAnnotation();71 tableAnnotation.excludeFields = new String[] { "fieldB" };72 assertThat( toTableValue( new AnotherPojo(), tableAnnotation ).getData() )73 .containsExactly( Arrays.asList( "fieldA" ), Arrays.asList( "test" ) );74 // single POJO with inclusion filter75 tableAnnotation = new TableAnnotation();76 tableAnnotation.includeFields = new String[] { "fieldA" };77 assertThat( toTableValue( new AnotherPojo(), tableAnnotation ).getData() )78 .containsExactly( Arrays.asList( "fieldA" ), Arrays.asList( "test" ) );79 // single POJO transposed80 tableAnnotation = new TableAnnotation();81 tableAnnotation.transpose = true;82 assertThat( toTableValue( new TestPojo(), tableAnnotation ).getData() )83 .containsExactly( Arrays.asList( "x", "5" ), Arrays.asList( "y", "6" ) );84 // single POJO vertical header85 tableAnnotation = new TableAnnotation();86 tableAnnotation.header = Table.HeaderType.VERTICAL;87 assertThat( toTableValue( new TestPojo(), tableAnnotation ).getData() )88 .containsExactly( Arrays.asList( "x", "5" ), Arrays.asList( "y", "6" ) );89 // single POJO columnTitles set90 tableAnnotation = new TableAnnotation();91 tableAnnotation.columnTitles = new String[] { "t1", "t2" };92 assertThat( toTableValue( new TestPojo(), tableAnnotation ).getData() )93 .containsExactly( Arrays.asList( "t1", "t2" ), Arrays.asList( "5", "6" ) );94 // string array95 assertThat( toTableValue( new String[][] { { "1" } }, new TableAnnotation() ).getData() )96 .containsExactly( Arrays.asList( "1" ) );97 // mixed array98 assertThat( toTableValue( new Object[][] { { "a" }, { 3 } }, new TableAnnotation() ).getData() )99 .containsExactly( Arrays.asList( "a" ), Arrays.asList( "3" ) );100 // 2 columns101 assertThat( toTableValue( new Object[][] { { 1, 2 }, { 3, 4 } }, new TableAnnotation() ).getData() )102 .containsExactly( Arrays.asList( "1", "2" ), Arrays.asList( "3", "4" ) );103 // DataTable104 assertThat( toTableValue( DataTables.table( 2, 1, 2, 3, 4 ), new TableAnnotation() ).getData() )105 .containsExactly( Arrays.asList( "1", "2" ), Arrays.asList( "3", "4" ) );106 ArrayList arrayList = new ArrayList();107 arrayList.add( newArrayList( 5 ) );108 assertThat( toTableValue( arrayList, new TableAnnotation() ).getData() )109 .containsExactly( Arrays.asList( "5" ) );110 assertThat( toTableValue( new Object[][] { { 1, 2 }, { 3, 4 } }, new TableAnnotation() ).getData() )111 .isEqualTo( newArrayList( newArrayList( "1", "2" ), newArrayList( "3", "4" ) ) );112 tableAnnotation = new TableAnnotation();113 tableAnnotation.columnTitles = new String[] { "t1", "t2" };114 assertThat( toTableValue( new Object[][] { { 1, 2 }, { 3, 4 } }, tableAnnotation ).getData() )115 .isEqualTo( newArrayList( newArrayList( "t1", "t2" ), newArrayList( "1", "2" ), newArrayList( "3", "4" ) ) );116 tableAnnotation = new TableAnnotation();117 tableAnnotation.columnTitles = new String[] { "t1", "t2" };118 tableAnnotation.transpose = true;119 assertThat( toTableValue( new Object[][] { { 1, 2 }, { 3, 4 } }, tableAnnotation ).getData() )120 .isEqualTo( newArrayList( newArrayList( "t1", "1", "3" ), newArrayList( "t2", "2", "4" ) ) );121 }122 public static DataTable toTableValue( Object tableValue, Table tableAnnotation ) {123 return new DefaultTableFormatter( new FormatterConfiguration() {124 @Override125 public Formatter<?> getFormatter( Class<?> typeToBeFormatted ) {126 return DefaultFormatter.INSTANCE;127 }128 }, DefaultFormatter.INSTANCE ).format( tableValue, tableAnnotation, "param1" );129 }130 @Test131 public void testNumberedRows() {132 TableAnnotation tableAnnotation = new TableAnnotation();133 tableAnnotation.numberedRows = true;134 assertThat( toTableValue( TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS, tableAnnotation ).getData() )135 .isEqualTo(136 newArrayList( newArrayList( "#", "h1", "h2" ), newArrayList( "1", "a1", "a2" ), newArrayList( "2", "b1", "b2" ) ) );137 }138 @Test139 @DataProvider( { "", "#", "Customer Header" } )140 public void testNumberedRowsHeader( String header ) {141 TableAnnotation tableAnnotation = new TableAnnotation();142 tableAnnotation.numberedRowsHeader = header;143 assertThat( toTableValue( TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS, tableAnnotation ).getData() )144 .isEqualTo(145 newArrayList( newArrayList( header, "h1", "h2" ), newArrayList( "1", "a1", "a2" ),146 newArrayList( "2", "b1", "b2" ) ) );147 }148 @Test( expected = JGivenWrongUsageException.class )149 public void testExceptionWhenNumberedRowsHeaderIsUsedWithoutHeader() {150 TableAnnotation tableAnnotation = new TableAnnotation();151 tableAnnotation.numberedRowsHeader = "#";152 tableAnnotation.header = Table.HeaderType.NONE;153 toTableValue( TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS, tableAnnotation );154 }155 @Test156 public void testNumberedColumns() {157 TableAnnotation tableAnnotation = new TableAnnotation();158 tableAnnotation.numberedColumns = true;159 tableAnnotation.transpose = true;160 tableAnnotation.header = Table.HeaderType.VERTICAL;161 assertThat( toTableValue( TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS, tableAnnotation ).getData() )162 .isEqualTo(163 newArrayList( newArrayList( "#", "1", "2" ), newArrayList( "h1", "a1", "b1" ), newArrayList( "h2", "a2", "b2" ) ) );164 }165 @Test166 @DataProvider( { "", "#", "Customer Header" } )167 public void testNumberedColumnsHeader( String header ) {168 TableAnnotation tableAnnotation = new TableAnnotation();169 tableAnnotation.numberedColumnsHeader = header;170 tableAnnotation.header = Table.HeaderType.VERTICAL;171 tableAnnotation.transpose = true;172 assertThat( toTableValue( TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS, tableAnnotation ).getData() )173 .isEqualTo(174 newArrayList( newArrayList( header, "1", "2" ), newArrayList( "h1", "a1", "b1" ),175 newArrayList( "h2", "a2", "b2" ) ) );176 }177 @Test( expected = JGivenWrongUsageException.class )178 public void testExceptionWhenNumberedColumnsHeaderIsUsedWithoutHeader() {179 TableAnnotation tableAnnotation = new TableAnnotation();180 tableAnnotation.numberedColumnsHeader = "#";181 toTableValue( TABLE_WITH_THREE_ROWS_AND_TWO_COLUMNS, tableAnnotation );182 }183 @Test184 public void testObjectFormattingOption() {185 TableAnnotation tableAnnotation = new TableAnnotation();186 tableAnnotation.objectFormatting = Table.ObjectFormatting.PLAIN;187 assertThat( toTableValue( new TestPojo(), tableAnnotation ).getData() )188 .containsExactly( Arrays.asList( "param1" ), Arrays.asList( "TestPojo: 5, 6" ) );189 }190 @Test191 public void testCustomRowFormattingOption() {192 TableAnnotation tableAnnotation = new TableAnnotation();193 tableAnnotation.rowFormatter = TestRowFormatterFactory.class;194 assertThat( toTableValue( new TestPojo(), tableAnnotation ).getData() )195 .containsExactly( Arrays.asList( "FooBar" ), Arrays.asList( "TestPojo: 5, 6 fooBar" ) );196 }197 public static class TestRowFormatter extends RowFormatter {198 @Override199 public List<String> header() {200 return Arrays.asList( "FooBar" );201 }202 @Override203 public List<String> formatRow( Object object ) {204 return Arrays.asList( object.toString() + " fooBar" );205 }206 }207 public static class TestRowFormatterFactory implements RowFormatterFactory {208 @Override209 public RowFormatter create( Class<?> parameterType, String parameterName, Table tableAnnotation,210 Annotation[] annotations,211 FormatterConfiguration configuration, ObjectFormatter<?> objectFormatter ) {212 return new TestRowFormatter();213 }214 }215}...

Full Screen

Full Screen

Source:DefaultTableFormatter.java Github

copy

Full Screen

...19 * The default implementation to format a table argument20 */21public class DefaultTableFormatter implements TableFormatter {22 public static final String DEFAULT_NUMBERED_HEADER = "#";23 private final FormatterConfiguration formatterConfiguration;24 private final ObjectFormatter<?> objectFormatter;25 public DefaultTableFormatter( FormatterConfiguration formatterConfiguration, ObjectFormatter<?> objectFormatter ) {26 this.formatterConfiguration = formatterConfiguration;27 this.objectFormatter = objectFormatter;28 }29 @Override30 public DataTable format( Object tableArgument, Table tableAnnotation, String parameterName, Annotation... allAnnotations ) {31 DataTable dataTable = toDataTable( tableArgument, tableAnnotation, parameterName, allAnnotations );32 addNumberedRows( tableAnnotation, dataTable );33 addNumberedColumns( tableAnnotation, dataTable );34 return dataTable;35 }36 private static void addNumberedRows( Table tableAnnotation, DataTable dataTable ) {37 String customHeader = tableAnnotation.numberedRowsHeader();38 boolean hasCustomerHeader = !customHeader.equals( AnnotationUtil.ABSENT );39 if( tableAnnotation.numberedRows() || hasCustomerHeader ) {40 ApiUtil.isTrue( !hasCustomerHeader || dataTable.hasHorizontalHeader(),41 "Using numberedRowsHeader in @Table without having a horizontal header." );42 int rowCount = dataTable.getRowCount();43 List<String> column = Lists.newArrayListWithExpectedSize( rowCount );44 addHeader( customHeader, column, dataTable.hasHorizontalHeader() );45 addNumbers( rowCount, column );46 dataTable.addColumn( 0, column );47 }48 }49 private static void addNumberedColumns( Table tableAnnotation, DataTable dataTable ) {50 String customHeader = tableAnnotation.numberedColumnsHeader();51 boolean hasCustomerHeader = !customHeader.equals( AnnotationUtil.ABSENT );52 if( tableAnnotation.numberedColumns() || hasCustomerHeader ) {53 ApiUtil.isTrue( !hasCustomerHeader || dataTable.hasVerticalHeader(),54 "Using numberedColumnsHeader in @Table without having a vertical header." );55 int columnCount = dataTable.getColumnCount();56 List<String> row = Lists.newArrayListWithExpectedSize( columnCount );57 addHeader( customHeader, row, dataTable.hasVerticalHeader() );58 addNumbers( columnCount, row );59 dataTable.addRow( 0, row );60 }61 }62 private static void addHeader( String customHeader, List<String> column, boolean hasHeader ) {63 boolean hasCustomerHeader = !customHeader.equals( AnnotationUtil.ABSENT );64 if( hasHeader ) {65 String header = DEFAULT_NUMBERED_HEADER;66 if( hasCustomerHeader ) {67 header = customHeader;68 }69 column.add( header );70 }71 }72 private static void addNumbers( int count, List<String> column ) {73 int counter = 1;74 while( column.size() < count ) {75 column.add( Integer.toString( counter ) );76 counter++;77 }78 }79 private DataTable toDataTable( Object tableValue, Table tableAnnotation, String parameterName, Annotation[] annotations ) {80 List<List<String>> result = Lists.newArrayList();81 Iterable<?> rows = toIterable( tableValue );82 if( rows == null ) {83 rows = ImmutableList.of( tableValue );84 }85 boolean first = true;86 int ncols = 0;87 for( Object row : rows ) {88 if( first ) {89 if( toIterable( row ) == null ) {90 return pojosToTableValue( rows, tableAnnotation, parameterName, annotations );91 }92 }93 List<String> values = toStringList( row );94 if( !first && ncols != values.size() ) {95 throw new JGivenWrongUsageException( "Number of columns in @Table annotated parameter is not equal for all rows. Expected "96 + ncols + " got " + values.size() );97 }98 ncols = values.size();99 result.add( values );100 first = false;101 }102 if( tableAnnotation.columnTitles().length > 0 ) {103 result.add( 0, Arrays.asList( tableAnnotation.columnTitles() ) );104 }105 result = tableAnnotation.transpose() ? transpose( result ) : result;106 return new DataTable( tableAnnotation.header(), result );107 }108 DataTable pojosToTableValue( Iterable<?> objects, final Table tableAnnotation, String parameterName, Annotation[] annotations ) {109 Object first = objects.iterator().next();110 RowFormatterFactory objectRowFormatterFactory = ReflectionUtil.newInstance( tableAnnotation.rowFormatter() );111 RowFormatter formatter = objectRowFormatterFactory.create( first.getClass(), parameterName, tableAnnotation, annotations,112 formatterConfiguration, objectFormatter );113 List<List<String>> list = Lists.newArrayList();114 if( tableAnnotation.header() != Table.HeaderType.NONE ) {115 if( tableAnnotation.columnTitles().length > 0 ) {116 list.add( Arrays.asList( tableAnnotation.columnTitles() ) );117 } else {118 list.add( formatter.header() );119 }120 }121 for( Object o : objects ) {122 list.add( formatter.formatRow( o ) );123 }124 list = formatter.postProcess( list );125 list = tableAnnotation.transpose() || tableAnnotation.header().isVertical() ? transpose( list ) : list;126 return new DataTable( tableAnnotation.header(), list );127 }128 static List<List<String>> transpose( List<List<String>> list ) {129 List<List<String>> transposed = Lists.newArrayList();130 for( int rowIdx = 0; rowIdx < list.size(); rowIdx++ ) {131 List<String> row = list.get( rowIdx );132 for( int colIdx = 0; colIdx < row.size(); colIdx++ ) {133 if( rowIdx == 0 ) {134 transposed.add( Lists.<String>newArrayList() );135 }136 transposed.get( colIdx ).add( row.get( colIdx ) );137 }138 }139 return transposed;140 }141 private static List<String> toStringList( Object row ) {142 List<String> list = Lists.newArrayList();143 Iterable<?> objects = toIterable( row );144 if( objects == null ) {145 throw new JGivenWrongUsageException( "@Table annotated argument cannot be converted to a data table." );146 }147 for( Object o : objects ) {148 list.add( toDefaultStringFormat( o ) );149 }150 return list;151 }152 private static Iterable<?> toIterable( Object value ) {153 if( value instanceof Iterable<?> ) {154 return (Iterable<?>) value;155 }156 if( value.getClass().isArray() ) {157 return arrayToList( value );158 }159 return null;160 }161 private static Iterable<?> arrayToList( Object array ) {162 int length = Array.getLength( array );163 if( length == 0 ) {164 return Collections.emptyList();165 }166 List<Object> result = Lists.newArrayList();167 for( int i = 0; i < length; i++ ) {168 result.add( Array.get( array, i ) );169 }170 return result;171 }172 private static String toDefaultStringFormat( Object value ) {173 return DefaultFormatter.INSTANCE.format( value );174 }175 public static class Factory implements TableFormatterFactory {176 @Override177 public TableFormatter create( FormatterConfiguration formatterConfiguration, ObjectFormatter<?> objectFormatter ) {178 return new DefaultTableFormatter( formatterConfiguration, objectFormatter );179 }180 }181}...

Full Screen

Full Screen

Source:ParameterFormattingUtil.java Github

copy

Full Screen

...34 ObjectFormatter<?> formatting = getFormatting( annotations, Sets.<Class<?>>newHashSet(), null, parameterName );35 if( formatting != null ) {36 return formatting;37 }38 Formatter<T> formatter = (Formatter<T>) configuration.getFormatter( parameterType );39 if( formatter != null ) {40 return new StepFormatter.TypeBasedFormatting<T>( formatter, annotations );41 }42 return DEFAULT_FORMATTING;43 }44 /**45 * Recursively searches for formatting annotations.46 *47 * @param visitedTypes used to prevent an endless loop48 * @param parameterName49 */50 private StepFormatter.Formatting<?, ?> getFormatting( Annotation[] annotations, Set<Class<?>> visitedTypes,51 Annotation originalAnnotation, String parameterName ) {52 List<StepFormatter.Formatting<?, ?>> foundFormatting = Lists.newArrayList();53 Table tableAnnotation = null;54 for( Annotation annotation : annotations ) {55 try {56 if( annotation instanceof Format ) {57 Format arg = (Format) annotation;58 foundFormatting.add( new StepFormatter.ArgumentFormatting( ReflectionUtil.newInstance( arg.value() ), arg.args() ) );59 } else if( annotation instanceof Table ) {60 tableAnnotation = (Table) annotation;61 } else if( annotation instanceof AnnotationFormat ) {62 AnnotationFormat arg = (AnnotationFormat) annotation;63 foundFormatting.add( new StepFormatter.ArgumentFormatting(64 new StepFormatter.AnnotationBasedFormatter( arg.value().newInstance(), originalAnnotation ) ) );65 } else {66 Class<? extends Annotation> annotationType = annotation.annotationType();67 if( !visitedTypes.contains( annotationType ) ) {68 visitedTypes.add( annotationType );69 StepFormatter.Formatting<?, ?> formatting = getFormatting( annotationType.getAnnotations(), visitedTypes,70 annotation, parameterName );71 if( formatting != null ) {72 foundFormatting.add( formatting );73 }74 }75 }76 } catch( Exception e ) {77 throw Throwables.propagate( e );78 }79 }80 if( foundFormatting.size() > 1 ) {81 Formatting<?, ?> innerFormatting = Iterables.getLast( foundFormatting );82 foundFormatting.remove( innerFormatting );83 ChainedFormatting<?> chainedFormatting = new StepFormatter.ChainedFormatting<Object>( (ObjectFormatter<Object>) innerFormatting );84 for( StepFormatter.Formatting<?, ?> formatting : Lists.reverse( foundFormatting ) ) {85 chainedFormatting.addFormatting( (StepFormatter.Formatting<?, String>) formatting );86 }87 foundFormatting.clear();88 foundFormatting.add( chainedFormatting );89 }90 if( tableAnnotation != null ) {91 ObjectFormatter<?> objectFormatter = foundFormatting.isEmpty()92 ? DefaultFormatter.INSTANCE93 : foundFormatting.get( 0 );94 return getTableFormatting( annotations, parameterName, tableAnnotation, objectFormatter );95 }96 if( foundFormatting.isEmpty() ) {97 return null;98 }99 return foundFormatting.get( 0 );100 }101 private StepFormatter.Formatting<?, ?> getTableFormatting( Annotation[] annotations, String parameterName, Table annotation,102 ObjectFormatter<?> objectFormatter ) {103 Table tableAnnotation = annotation;104 TableFormatterFactory factory = createTableFormatterFactory( parameterName, tableAnnotation );105 TableFormatter tableFormatter = factory.create( configuration, objectFormatter );106 return new StepFormatter.TableFormatting( tableFormatter, tableAnnotation, parameterName, annotations );107 }108 private TableFormatterFactory createTableFormatterFactory( String parameterName, Table tableAnnotation ) {109 Class<? extends TableFormatterFactory> formatterFactoryClass = tableAnnotation.formatter();110 try {111 return ReflectionUtil.newInstance( formatterFactoryClass );112 } catch( Exception e ) {113 throw new JGivenWrongUsageException(114 "Could not create an instance of " + formatterFactoryClass.getName()115 + " which was specified at the @Table annotation for parameter '" + parameterName116 + "'. Most likely this was due to a missing default constructor",117 TableFormatterFactory.class, e );118 }119 }120 public List<String> toStringList( List<ObjectFormatter<?>> formatter, List<?> arguments ) {121 List<String> result = Lists.newArrayList();122 for( int i = 0; i < arguments.size(); i++ ) {123 ObjectFormatter<?> formatting = DEFAULT_FORMATTING;124 if( i < formatter.size() && formatter.get( i ) != null ) {125 formatting = formatter.get( i );126 }127 result.add( formatUsingFormatterOrDefault( formatting, arguments.get( i ) ) );128 }129 return result;130 }131 private <T> String formatUsingFormatterOrDefault( ObjectFormatter<T> formatting, Object o ) {132 return formatting.format( (T) o );133 }134 public List<ObjectFormatter<?>> getFormatter( Class<?>[] parameterTypes, List<String> parameterNames,135 Annotation[][] parameterAnnotations ) {136 List<ObjectFormatter<?>> res = Lists.newArrayList();137 for( int i = 0; i < parameterTypes.length; i++ ) {138 Annotation[] annotations = parameterAnnotations[i];139 if( !AnnotationUtil.isHidden( annotations ) ) {...

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.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful