SergeyPirogov / video-recorder-java

This library allows easily record video of your UI tests by just putting couple annotations.
http://automation-remarks.com/video-recorder-java/
MIT License
219 stars 66 forks source link
automation automation-remarks junit test testng

= Video Recorder :toc: left

image:https://travis-ci.org/SergeyPirogov/video-recorder-java.svg?branch=master["Build Status", link="https://travis-ci.org/SergeyPirogov/video-recorder-java"]

This library allows easily record video of your UI tests by just putting couple annotations.

http://sergeypirogov.github.io/video-recorder-java/[Documentation]

Supports popular Java test frameworks:

== JUnit Rule:

.maven [source,java]

com.automation-remarks video-recorder-junit LATEST

.gradle [source,java]

compile group: 'com.automation-remarks', name: 'video-recorder-junit', version: '1.+'

.JUnitVideoTest.class [source,java]

import com.automation.remarks.video.annotations.Video;
import com.automation.remarks.video.junit.VideoRule;
import org.junit.Rule;
import org.junit.Test;

import static junit.framework.Assert.assertTrue;

public class JUnitVideoTest {

@Rule
public VideoRule videoRule = new VideoRule();

@Test
@Video
public void shouldFailAndCreateRecordWithTestName() {
    Thread.sleep(5000);
    assert false;
}

@Test
@Video(name = "second_test")
public void videoShouldHaveNameSecondTest() {
    Thread.sleep(10000);
    assertTrue(false);
}

}

JUnit 5

.gradle [source,java]

compile group: 'com.automation-remarks', name: 'video-recorder-junit5', version: '1.+'

[source,java]

import com.automation.remarks.junit5.Video;


public class JUnitVideoTest {

@Test
@Video
public void shouldFailAndCreateRecordWithTestName() {
    Thread.sleep(5000);
    assert false;
}

@Test
@Video(name = "second_test")
public void videoShouldHaveNameSecondTest() {
    Thread.sleep(10000);
    assertTrue(false);
}

}

== TestNG:

.maven [source,java]

com.automation-remarks video-recorder-testng LATEST

.gradle [source,java]

compile group: 'com.automation-remarks', name: 'video-recorder-testng', version: '1.+'

.TestNgVideoTest.class [source,java]

import com.automation.remarks.video.annotations.Video;
import com.automation.remarks.video.testng.VideoListener;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

import static org.testng.Assert.assertTrue;

@Listeners(UniversalVideoListener.class) public class TestNgVideoTest {

@Test
@Video
public void shouldFailAndCreateRecordWithTestName() {
    Thread.sleep(1000);
    assert false;
}

@Test
@Video(name = "second_test")
public void videoShouldHaveNameSecondTest(){
    Thread.sleep(1000);
    assertTrue(false);
}

}

== Configuration

You are able to set some configuration parameters for Video Recorder.

Create properties file video.properties in classpath:


video.folder=${user home}/video video.enabled=false // default true video.mode=ALL // default ANNOTATED recorder.type=FFMPEG // default MONTE video.save.mode=ALL // default FAILED_ONLY video.frame.rate=1 // default 24 ffmpeg.format=x11grab // default value depends on OS platform ffmpeg.display=:0.0 // default value depends on OS platform ffmpeg.pixelFormat=yuv444p // default yuv420p (for Apple QuickTime player compatibility)

or with maven


mvn test -Dvideo.folder=custom_folder // default video -Dvideo.enabled=false // default true -Dvideo.mode=ALL // default ANNOTATED -Drecorder.type=FFMPEG // default MONTE -Dvideo.save.mode=ALL // default FAILED_ONLY -Dvideo.frame.rate=1 // default 24 -Dvideo.screen.size=1024x768 // custom screen size -Dffmpeg.display=:1.0+10,20 // custom display configuration for ffmpeg -Dffmpeg.pixelFormat=yuv444p // default yuv420p

=== FFMPEG recorder configuration

In order to use ffmpeg type recorder first you need to perform such steps:

==== Linux or Mac

Need to install https://www.ffmpeg.org/download.html[ffmpeg recorder]

On ubuntu you can do it using such command:


sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install ffmpeg

For Mac just use brew:


brew install ffmpeg

==== Windows

In case of Windows platform you need to download https://www.ffmpeg.org/download.html[ffmpeg]

Just download it and unzip to some folder on you PC. Example C:\ffmpeg

Then set System variable path for ffmpeg. http://www.computerhope.com/issues/ch000549.htm[Example]

Example: add to PATH variable ;C:\ffmpeg\bin

Also you need to https://github.com/SergeyPirogov/video-recorder-java/raw/master/core/src/main/resources/SendSignalCtrlC.exe[download SendSignalCtrlC.exe] utility and put into the folder ffmpeg/bin.

The final result should be folder with ffmpeg, SendSignalCtrlC.exe utilities and System variable that point to this folder.

To be sure that everything works properly, open CMD and perform first command:

ffmpeg

The output should look like this:

C:\Users\sepi>ffmpeg ffmpeg version N-81234-ge1be80a Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.4.0 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-libebur128 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib libavutil 55. 28.100 / 55. 28.100 libavcodec 57. 51.100 / 57. 51.100 libavformat 57. 44.100 / 57. 44.100 libavdevice 57. 0.102 / 57. 0.102 libavfilter 6. 49.100 / 6. 49.100 libswscale 4. 1.100 / 4. 1.100 libswresample 2. 1.100 / 2. 1.100 libpostproc 54. 0.100 / 54. 0.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

Than execute in CMD another command:

SendSignalCtrlC

Output:

C:\Users\sepi>SendSignalCtrlC SendSignalCtrlC

- send ctrl-c to process (hex ok) ---- If no errors, that everything set properly. You can you FFMPEG recorder type in ypur tests == Remote Video Recording: Build remote module: ---- ./gradlew remote:jar ---- Run hub: ---- java -jar video-recorder-remote-x.x.jar -role hub ---- Run node: ---- java -jar video-recorder-remote-x.x.jar -servlets "com.automation.remarks.remote.node.Video" -role node -port 5555 -hub "http://localhost:4444/grid/register" ---- === TestNG + Remote Video recorder Change listener in your tests to *RemoteVideoListener*: .TestNgRemoteVideonTest.class [source,java] ---- import com.automation.remarks.testng.GridInfoExtractor; import com.automation.remarks.testng.RemoteVideoListener; import com.automation.remarks.video.annotations.Video; import com.automation.remarks.video.recorder.VideoRecorder; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.annotations.BeforeClass; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import java.net.URL; import static com.automation.remarks.testng.test.TestNGRemoteListenerTest.startGrid; import static org.testng.Assert.fail; @Listeners(UniversalVideoListener.class) public class IntegrationTest { RemoteWebDriver driver; @BeforeClass public void setUp() throws Exception { URL hubUrl = new URL("http://localhost:4444/wd/hub"); driver = new RemoteWebDriver(hubUrl, DesiredCapabilities.firefox()); String nodeIp = GridInfoExtractor.getNodeIp(hubUrl, driver.getSessionId().toString()); System.setProperty("video.remote", "true"); System.setProperty("remote.video.hub", nodeIp); } @Test @Video public void test() throws InterruptedException { driver.get("http://automation-remarks.com"); } } ---- == Recorder logging You can log recorder events using log4j. Just need to set DEBUG level fot *package com.automation.remarks.video.recorder* Log4j settings example: with Console and File appenders. ---- log4j.rootLogger=INFO, CA, FA #Console Appender log4j.appender.CA=org.apache.log4j.ConsoleAppender log4j.appender.CA.layout=org.apache.log4j.PatternLayout log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n #File Appender log4j.appender.FA=org.apache.log4j.FileAppender log4j.appender.FA.File=ffmpeg.log log4j.appender.FA.layout=org.apache.log4j.PatternLayout log4j.appender.FA.layout.ConversionPattern=[%-5p] %d %c - %m%n # Set the logger level of File Appender to DEBUG log4j.logger.com.automation.remarks.video.recorder=DEBUG, FA log4j.additivity.com.automation.remarks.video.recorder=false ---- == License See https://github.com/SergeyPirogov/video-recorder-java/blob/master/LICENSE.txt/[LICENSE]. include::CHANGELOG.adoc[] By http://automation-remarks.com/[automation-remarks.com] Released at https://oss.sonatype.org https://blog.sonatype.com/2010/01/how-to-generate-pgp-signatures-with-maven/ https://github.com/bmuschko/gradle-nexus-plugin