SlideShare uma empresa Scribd logo
1 de 59
Baixar para ler offline
TESTING JAVA
CODE
EFFECTIVELY
ANDRES ALMIRAY
@AALMIRAY
ANDRESALMIRAY.COM
@aalmiray
DISCLAIMER
@aalmiray
@aalmiray
@aalmiray
@aalmiray
GET THE CODE
https://github.com/aalmiray/javatrove/
@aalmiray
ASSERTIONS
@aalmiray
Hamcrest - http://hamcrest.org/JavaHamcrest/
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
@RunWith(JUnitParamsRunner.class)
public class HelloServiceHamcrestTest {
@Test
@Parameters(source = HelloParameters.class)
public void sayHello(String input, String output) {
// given:
HelloService service = new DefaultHelloService();
// expect:
assertThat(service.sayHello(input), equalTo(output));
}
}
@aalmiray
Hamcrest - http://hamcrest.org/JavaHamcrest/
•  Descriptive conditions
•  Easily extensible
•  Bundled with JUnit
@aalmiray
AssertJ-
http://joel-costigliola.github.io/assertj/
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(JUnitParamsRunner.class)
public class HelloServiceAssertJTest {
@Test
@Parameters(source = HelloParameters.class)
public void sayHello(String input, String output) {
// given:
HelloService service = new DefaultHelloService();
// expect:
assertThat(service.sayHello(input)).isEqualTo(output);
}
}
@aalmiray
AssertJ-
http://joel-costigliola.github.io/assertj/
•  Fluent interface design for assertions
•  Inspired by FEST-assert and Hamcrest
•  Soft assertions
@aalmiray
Truth- http://google.github.io/truth/
import static com.google.common.truth.Truth.assertThat;
@RunWith(JUnitParamsRunner.class)
public class HelloServiceThruthTest {
@Test
@Parameters(source = HelloParameters.class)
public void sayHello(String input, String output) {
// given:
HelloService service = new DefaultHelloService();
// expect:
assertThat(service.sayHello(input)).isEqualTo(output);
}
}
@aalmiray
Truth- http://google.github.io/truth/
•  Fluent interface design for assertions/
propositions
•  Inspired by FEST-assert and Hamcrest
•  Soft assertions
•  Curated by Google
•  http://google.github.io/truth/comparison
@aalmiray
JGoTesting-
https://gitlab.com/tastapod/jgotesting
import org.jgotesting.rule.JGoTestRule;
import static org.hamcrest.Matchers.equalTo;
@RunWith(JUnitParamsRunner.class)
public class HelloServiceJGoTestingTest {
@org.junit.Rule
public final JGoTestRule test = new JGoTestRule();
@Test
@Parameters(source = HelloParameters.class)
public void sayHello(String input, String output) {
// given:
HelloService service = new DefaultHelloService();
// expect:
test.check(service.sayHello(input), equalTo(output));
}
}
@aalmiray
JGoTesting-
https://gitlab.com/tastapod/jgotesting
•  Inspired in Go’s testing support
•  Multiple checks may result in a single test
failure -> soft assertions
@aalmiray
P14N
(PARAMETERIZATION)
@aalmiray
@RunWith(Parameterized.class)
public class HelloServiceParameterizedTest {
@Parameterized.Parameters(name = "Invoking HelloService.sayHello(''{0}'')
yields ''{1}''")
public static Collection<Object[]> data() {
return Arrays.asList(
new String[]{"", "Howdy stranger!"},
new String[]{"Test", "Hello Test"}
);
}
private final String input;
private final String output;
public HelloServiceParameterizedTest(String input, String output) {
this.input = input;
this.output = output;
}
@Test
public void sayHello() {
// given:
HelloService service = new DefaultHelloService();
// expect:
assertThat(service.sayHello(input), equalTo(output));
}
}
@aalmiray
@RunWith(Parameterized.class)
public class HelloServiceParameterizedTest {
@Parameterized.Parameters(name = "Invoking HelloService.sayHello(''{0}'')
yields ''{1}''")
public static Collection<Object[]> data() {
return Arrays.asList(
new String[]{"", "Howdy stranger!"},
new String[]{"Test", "Hello Test"}
);
}
@Parameterized.Parameter(0)
public String input;
@Parameterized.Parameter(1)
public String output;
@Test
public void sayHello() {
// given:
HelloService service = new DefaultHelloService();
// expect:
assertThat(service.sayHello(input), equalTo(output));
}
}
@aalmiray
JUnitParams -
https://github.com/Pragmatists/JUnitParams
@RunWith(JUnitParamsRunner.class)
public class SampleServiceTest {
@Test
@Parameters({",Howdy stranger!",
"Test, Hello Test"})
public void sayHello(String input, String output) {
// given:
SampleService service = new SampleService();
// expect:
assertThat(service.sayHello(input), equalTo(output));
}
}
@aalmiray
JUnitParams -
https://github.com/Pragmatists/JUnitParams
•  Parameterize multiple methods with different
argument cardinality
•  Different data provider strategies
@aalmiray
MOCKING
@aalmiray
Mockito - http://mockito.org
@Test @Parameters({",Howdy stranger!", "Test, Hello Test"})
public void sayHelloAction(String input, String output) {
// given:
SampleController controller = new SampleController();
controller.setModel(new SampleModel());
controller.setService(mock(SampleService.class));
// expectations
when(controller.getService().sayHello(input)).thenReturn(output);
// when:
controller.getModel().setInput(input);
controller.sayHello();
// then:
assertThat(controller.getModel().getOutput(), equalTo(output));
verify(controller.getService(), only()).sayHello(input);
}
@aalmiray
Mockito - http://mockito.org
•  Fluid DSL based on static methods
•  Provides support for Stubs, Mocks, and Spies
•  Mock interfaces, abstract classes, and
concrete classes
@aalmiray
Jukito - https://github.com/ArcBees/Jukito
@RunWith(JukitoRunner.class)
public class SampleControllerJukitoTest {
@Inject private SampleController controller;
@Before
public void setupMocks(SampleService sampleService) {
when(sampleService.sayHello("Test")).thenReturn("Hello Test");
}
@Test
public void sayHelloAction() {
controller.setModel(new SampleModel());
controller.getModel().setInput("Test");
controller.sayHello();
assertThat(controller.getModel().getOutput(),
equalTo("Hello Test"));
verify(controller.getService(), only()).sayHello("Test");
}
}
@aalmiray
Jukito - https://github.com/ArcBees/Jukito
•  Combines JUnit, Guice, and Mockito
•  Bind multiple values to the same source type
•  Can be used to parameterize test methods
@aalmiray
BDD
@aalmiray
JGiven - http://jgiven.org/
@Test
public void default_greeting_is_returned_when_blank_input_is_given() {
given().an_instance_of_the_service();
when().the_sayHello_method_is_invoked_with_$s("");
then().the_result_is_equal_to_$s("Howdy stranger!");
}
@Test
public void greeting_is_returned_when_input_is_given() {
given().an_instance_of_the_service();
when().the_sayHello_method_is_invoked_with_$s("Test");
then().the_result_is_equal_to_$s("Hello Test");
}
@aalmiray
JGiven - http://jgiven.org/
public static class TestSteps extends Stage<TestSteps> {
private HelloService service;
private String result;
public void an_instance_of_the_service() {
service = new DefaultHelloService();
}
public TestSteps the_sayHello_method_is_invoked_with_$s(String
input) {
result = service.sayHello(input);
return this;
}
public void the_result_is_equal_to_$s(String output) {
assertThat(result, equalTo(output));
}
}
@aalmiray
JGiven - http://jgiven.org
•  Java based BDD DSL
•  Scenarios can be composed and reused
•  Scenarios can be parameterized
•  Custom HTML/Asciidoc reports
@aalmiray
@aalmiray
Spock- http://spockframework.org
@spock.lang.Unroll
class HelloServiceSpecification extends Specification {
def "Invoking HelloService.sayHello('#input') yields '#output'"() {
given: "an instance of HelloService"
HelloService service = new DefaultHelloService()
when: "the sayHello method is invoked with '#input'"
String result = service.sayHello(input)
then: "the result should be equal to '#output'"
result == output
where:
input | output
'' | 'Howdy stranger!'
'Test' | 'Hello Test'
}
}
@aalmiray
Spock- http://spockframework.org
@spock.lang.Unroll
class HelloServiceSpecification extends Specification {
def "Invoking HelloService.sayHello('#input') yields '#output'"() {
given: "an instance of HelloService"
HelloService service = new DefaultHelloService()
when: "the sayHello method is invoked with '#input'"
String result = service.sayHello(input)
then: "the result should be equal to '#output'"
result == output
where:
input << ['', 'Test']
output << ['Howdy, stranger!', 'Hello Test']
}
}
@aalmiray
@aalmiray
Spock- http://spockframework.org
@spock.lang.Unroll
class SampleControllerSpec extends spock.lang.Specification {
def "Invoke say hello with #input results in #output"() {
given:
SampleController controller = new SampleController()
controller.model = new SampleModel()
controller.service = Mock(SampleService) {
sayHello(input) >> output
}
when:
controller.model.input = input
controller.sayHello()
then:
controller.model.output == output
1 * controller.service.sayHello(input)
where:
input | output
'' | 'Howdy, stranger!'
'Test' | 'Hello Test’
}
}
@aalmiray
Spock- http://spockframework.org
•  Groovy based DSL
•  Parameterize multiple methods with different
argument cardinality
•  Parameterize test method names
•  JUnit friendly (can use extensions and rules)
•  Soft assertions (verifyAll)
•  https://github.com/opaluchlukasz/junit2spock
@aalmiray
WAITING
@aalmiray
NETWORK AWARE JAVAFX APP
Write an application that consumes a REST
API.
Components must be small and reusable.
Say no to boilerplate code.
Behavior should be easy to test.
@aalmiray
DEMO
@aalmiray
Awaitility -
https://github.com/awaitility/awaitility
@Test
public void happyPath(Github github) {
// given:
Collection<Repository> repositories = createSampleRepositories();
when(github.repositories(ORGANIZATION))
.thenReturn(Observable.from(repositories));
// when:
model.setOrganization(ORGANIZATION);
controller.load();
await().timeout(2, SECONDS).until(model::getState, equalTo(State.READY));
// then:
assertThat(model.getRepositories(), hasSize(10));
assertThat(model.getRepositories(), equalTo(repositories));
verify(github, only()).repositories(ORGANIZATION);
}
@aalmiray
Awaitility -
https://github.com/awaitility/awaitility
•  DSL for testing multi-threaded code
•  Extensions available for Java8, Groovy, and
Scala
•  Conditions can be customized with Hamcrest
matchers
@aalmiray
WireMock- http://wiremock.org/
import static com.github.tomakehurst.wiremock.client.WireMock.*;
String nextUrl = "/organizations/1/repos?page=2";
List<Repository> repositories = createSampleRepositories();
stubFor(get(urlEqualTo("/orgs/" + ORGANIZATION + "/repos"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "text/json")
.withHeader("Link", "<http://localhost:8080" + nextUrl + ">; rel="next"")
.withBody(repositoriesAsJSON(repositories.subList(0, 5), objectMapper))));
stubFor(get(urlEqualTo(nextUrl ))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "text/json")
.withBody(repositoriesAsJSON(repositories.subList(5, 10), objectMapper))));
@aalmiray
WireMock- http://wiremock.org/
•  Supply custom HTTP response payloads
•  DSL for matching HTTP requests
•  Supports record and playback
@aalmiray
WEB
@aalmiray
TRIVIAL TODO WEBAPP
Store todo items in a database
Expose operations via REST API
@aalmiray
DEMO
@aalmiray
REST-assured -
https://github.com/rest-assured/rest-assured
import static io.restassured.RestAssured.given;
import static java.util.Arrays.asList;
import static org.hamcrest.Matchers.equalTo;
@Test
public void _01_initial_data_is_loaded() {
given().port(4567).
when().
get("/todos").
then().
body("todos.description", equalTo(asList("Add Javadoc")));
}
@aalmiray
REST-assured -
https://github.com/rest-assured/rest-assured
•  DSL for issuing HTTP requests
•  Validate and navigate response body if JSON,
XML, or HTML
@aalmiray
Arquillian- http://arquillian.org
@Deployment
public static WebArchive createDeployment() throws Exception {
File rootDir = new File(System.getProperty("user.dir"));
File[] files = Maven.resolver()
.resolve(…).withTransitivity().asFile();
return ShrinkWrap.create(WebArchive.class, "application.war")
.addPackage(”com.acme")
.setWebXML(new File(rootDir, "src/main/webapp/WEB-INF/web.xml"))
.addAsLibraries(files);
}
@aalmiray
Arquillian- http://arquillian.org
•  Container based testing, supporting Jetty,
Tomcat, Glassfish
•  Wildfly and others
•  Create deployable archives with Shrinkwrap
•  Combine with REST-assured for better results
@aalmiray
MISC
@aalmiray
DbUnit- http://dbunit.sourceforge.net/
@Test
public void testCleanInsert() throws Exception {
// when:
performInsertion();
// then:
String tableName = resolveDTOTableName();
IDataSet databaseDataSet = resolveDatabaseConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable(tableName);
StringWriter w = new StringWriter();
FlatXmlWriter xml = new FlatXmlWriter(w);
xml.write(databaseDataSet);
IDataSet expectedDataSet = createDataSetForInsertion();
ITable expectedTable = expectedDataSet.getTable(tableName);
w = new StringWriter();
xml = new FlatXmlWriter(w);
xml.write(expectedDataSet);
assertEqualsIgnoreCols(expectedTable, actualTable, ignoredColumns());
}
@aalmiray
XMLUnit- http://www.xmlunit.org
import org.custommonkey.xmlunit.XMLTestCase;
public class TestXmlContainingTypeAttribute extends XMLTestCase {
public void testXmlWithTypeAttribute() throws Exception {
String xml = "<data type="someType">" +
"<nested type="some_other_type">value</nested></data>";
XMLSerializer tested = new XMLSerializer();
tested.setTypeHintsEnabled(false);
tested.setTypeHintsCompatibility(false);
tested.setRootName("data");
JSON jsonRepresentation = tested.read(xml);
String result = tested.write(jsonRepresentation);
assertXMLEqual(xml, result);
}
}
@aalmiray
PdfUnit- http://www.pdfunit.com
@Test
public void hasText_OnFirstPage_InRegion() throws Exception {
String pdfUnderTest = "documentUnderTest.pdf";
int leftX = 17; // in millimeter
int upperY = 45;
int width = 80;
int height = 50;
PageRegion addressRegion = new PageRegion(leftX, upperY, width, height);
AssertThat.document(pdfUnderTest)
.restrictedTo(FIRST_PAGE)
.restrictedTo(addressRegion) .hasText()
.containing("John Doe Ltd.");
}
@aalmirayhttps://i.pinimg.com/736x/6b/47/05/6b47050f0f15b955cf725609749e1c87--elephant-baby-baby-elephants.jpg
@aalmiray
JUnit5 - http://junit.org/junit5/
•  Redesigned with Java8 in mind. Harness lambda
expressions/method references
•  Homogeneous Extension API (no more @Rule
and @ClassRule)
•  Can run JUnit 4.x tests
•  Experimental parameterization API
•  http://junit.org/junit5/docs/current/user-guide/
#migrating-from-junit4
@aalmiray
@aalmiray
HTTP://ANDRESALMIRAY.COM/NEWSLETTER
HTTP://ANDRESALMIRAY.COM/EDITORIAL
@aalmiray
THANK YOU!
ANDRES ALMIRAY
@AALMIRAY
ANDRESALMIRAY.COM

Mais conteúdo relacionado

Mais procurados

Unit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeUnit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and Node
Josh Mock
 
Django’s nasal passage
Django’s nasal passageDjango’s nasal passage
Django’s nasal passage
Erik Rose
 

Mais procurados (20)

A Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalA Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert Fornal
 
Jasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishyJasmine - why JS tests don't smell fishy
Jasmine - why JS tests don't smell fishy
 
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
QA Lab: тестирование ПО. Яков Крамаренко: "KISS Automation"
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala Microservices
 
Unit testing with mocha
Unit testing with mochaUnit testing with mocha
Unit testing with mocha
 
Java 8: the good, the bad and the ugly (JBCNConf 2017)
Java 8: the good, the bad and the ugly (JBCNConf 2017)Java 8: the good, the bad and the ugly (JBCNConf 2017)
Java 8: the good, the bad and the ugly (JBCNConf 2017)
 
Angular mix chrisnoring
Angular mix chrisnoringAngular mix chrisnoring
Angular mix chrisnoring
 
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
 
Java 8: the good, the bad and the ugly (Oracle Code Brussels 2017)
Java 8: the good, the bad and the ugly (Oracle Code Brussels 2017)Java 8: the good, the bad and the ugly (Oracle Code Brussels 2017)
Java 8: the good, the bad and the ugly (Oracle Code Brussels 2017)
 
Kotlin : Advanced Tricks - Ubiratan Soares
Kotlin : Advanced Tricks - Ubiratan SoaresKotlin : Advanced Tricks - Ubiratan Soares
Kotlin : Advanced Tricks - Ubiratan Soares
 
Unit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and NodeUnit testing JavaScript using Mocha and Node
Unit testing JavaScript using Mocha and Node
 
Jasmine BDD for Javascript
Jasmine BDD for JavascriptJasmine BDD for Javascript
Jasmine BDD for Javascript
 
Meck at erlang factory, london 2011
Meck at erlang factory, london 2011Meck at erlang factory, london 2011
Meck at erlang factory, london 2011
 
Tools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveTools for Making Machine Learning more Reactive
Tools for Making Machine Learning more Reactive
 
From typing the test to testing the type
From typing the test to testing the typeFrom typing the test to testing the type
From typing the test to testing the type
 
Protractor Training in Pune by QuickITDotnet
Protractor Training in Pune by QuickITDotnet Protractor Training in Pune by QuickITDotnet
Protractor Training in Pune by QuickITDotnet
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit TestingAdvanced Jasmine - Front-End JavaScript Unit Testing
Advanced Jasmine - Front-End JavaScript Unit Testing
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript Applications
 
Django’s nasal passage
Django’s nasal passageDjango’s nasal passage
Django’s nasal passage
 
Erlang Workshop at Dyncon 2011
Erlang Workshop at Dyncon 2011Erlang Workshop at Dyncon 2011
Erlang Workshop at Dyncon 2011
 

Semelhante a Testing Java Code Effectively - BaselOne17

Semelhante a Testing Java Code Effectively - BaselOne17 (20)

Testing Java Code Effectively
Testing Java Code EffectivelyTesting Java Code Effectively
Testing Java Code Effectively
 
Google guava
Google guavaGoogle guava
Google guava
 
How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014
 
Apex Testing and Best Practices
Apex Testing and Best PracticesApex Testing and Best Practices
Apex Testing and Best Practices
 
Client server part 12
Client server part 12Client server part 12
Client server part 12
 
JUnit Pioneer
JUnit PioneerJUnit Pioneer
JUnit Pioneer
 
Not your father's tests
Not your father's testsNot your father's tests
Not your father's tests
 
Unit testing CourseSites Apache Filter
Unit testing CourseSites Apache FilterUnit testing CourseSites Apache Filter
Unit testing CourseSites Apache Filter
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
 
Jason parsing
Jason parsingJason parsing
Jason parsing
 
Jersey
JerseyJersey
Jersey
 
Greach, GroovyFx Workshop
Greach, GroovyFx WorkshopGreach, GroovyFx Workshop
Greach, GroovyFx Workshop
 
How to Start Test-Driven Development in Legacy Code
How to Start Test-Driven Development in Legacy CodeHow to Start Test-Driven Development in Legacy Code
How to Start Test-Driven Development in Legacy Code
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based Testing
 
Anay - Fluent interfaces in testing
Anay - Fluent interfaces in testingAnay - Fluent interfaces in testing
Anay - Fluent interfaces in testing
 
2012 JDays Bad Tests Good Tests
2012 JDays Bad Tests Good Tests2012 JDays Bad Tests Good Tests
2012 JDays Bad Tests Good Tests
 
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
 
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
DEV-1550: Why Java 8? Or, What's a Lambda? – IBM Connect 2017
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]
 
JEEConf 2017 - Having fun with Javassist
JEEConf 2017 - Having fun with JavassistJEEConf 2017 - Having fun with Javassist
JEEConf 2017 - Having fun with Javassist
 

Mais de Andres Almiray

Mais de Andres Almiray (20)

Creando, creciendo, y manteniendo una comunidad de codigo abierto
Creando, creciendo, y manteniendo una comunidad de codigo abiertoCreando, creciendo, y manteniendo una comunidad de codigo abierto
Creando, creciendo, y manteniendo una comunidad de codigo abierto
 
Liberando a produccion con confianza
Liberando a produccion con confianzaLiberando a produccion con confianza
Liberando a produccion con confianza
 
Liberando a produccion con confidencia
Liberando a produccion con confidenciaLiberando a produccion con confidencia
Liberando a produccion con confidencia
 
OracleDB Ecosystem for Java Developers
OracleDB Ecosystem for Java DevelopersOracleDB Ecosystem for Java Developers
OracleDB Ecosystem for Java Developers
 
Softcon.ph - Maven Puzzlers
Softcon.ph - Maven PuzzlersSoftcon.ph - Maven Puzzlers
Softcon.ph - Maven Puzzlers
 
Maven Puzzlers
Maven PuzzlersMaven Puzzlers
Maven Puzzlers
 
Oracle Database Ecosystem for Java Developers
Oracle Database Ecosystem for Java DevelopersOracle Database Ecosystem for Java Developers
Oracle Database Ecosystem for Java Developers
 
JReleaser - Releasing at the speed of light
JReleaser - Releasing at the speed of lightJReleaser - Releasing at the speed of light
JReleaser - Releasing at the speed of light
 
Building modular applications with the Java Platform Module System and Layrry
Building modular applications with the Java Platform Module System and LayrryBuilding modular applications with the Java Platform Module System and Layrry
Building modular applications with the Java Platform Module System and Layrry
 
Going Reactive with g rpc
Going Reactive with g rpcGoing Reactive with g rpc
Going Reactive with g rpc
 
Building modular applications with JPMS and Layrry
Building modular applications with JPMS and LayrryBuilding modular applications with JPMS and Layrry
Building modular applications with JPMS and Layrry
 
Taking Micronaut out for a spin
Taking Micronaut out for a spinTaking Micronaut out for a spin
Taking Micronaut out for a spin
 
Apache Groovy's Metaprogramming Options and You
Apache Groovy's Metaprogramming Options and YouApache Groovy's Metaprogramming Options and You
Apache Groovy's Metaprogramming Options and You
 
What I wish I knew about Maven years ago
What I wish I knew about Maven years agoWhat I wish I knew about Maven years ago
What I wish I knew about Maven years ago
 
What I wish I knew about maven years ago
What I wish I knew about maven years agoWhat I wish I knew about maven years ago
What I wish I knew about maven years ago
 
The impact of sci fi in tech
The impact of sci fi in techThe impact of sci fi in tech
The impact of sci fi in tech
 
Gradle Ex Machina - Devoxx 2019
Gradle Ex Machina - Devoxx 2019Gradle Ex Machina - Devoxx 2019
Gradle Ex Machina - Devoxx 2019
 
Creating Better Builds with Gradle
Creating Better Builds with GradleCreating Better Builds with Gradle
Creating Better Builds with Gradle
 
Interacting with the Oracle Cloud Java SDK with Gradle
Interacting with the Oracle Cloud Java SDK with GradleInteracting with the Oracle Cloud Java SDK with Gradle
Interacting with the Oracle Cloud Java SDK with Gradle
 
Gradle ex-machina
Gradle ex-machinaGradle ex-machina
Gradle ex-machina
 

Último

Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Peter Udo Diehl
 

Último (20)

IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and Planning
 
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
 
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya HalderCustom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
Custom Approval Process: A New Perspective, Pavel Hrbacek & Anindya Halder
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří Karpíšek
 
Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...
Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...
Choosing the Right FDO Deployment Model for Your Application _ Geoffrey at In...
 
PLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. StartupsPLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. Startups
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through Observability
 
WebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM PerformanceWebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM Performance
 
Demystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John StaveleyDemystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John Staveley
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System Strategy
 
How we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdfHow we scaled to 80K users by doing nothing!.pdf
How we scaled to 80K users by doing nothing!.pdf
 
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová10 Differences between Sales Cloud and CPQ, Blanka Doktorová
10 Differences between Sales Cloud and CPQ, Blanka Doktorová
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
 
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
 
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
 
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfIntroduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
 
Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024
 
The UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoThe UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, Ocado
 
Intro in Product Management - Коротко про професію продакт менеджера
Intro in Product Management - Коротко про професію продакт менеджераIntro in Product Management - Коротко про професію продакт менеджера
Intro in Product Management - Коротко про професію продакт менеджера
 
Extensible Python: Robustness through Addition - PyCon 2024
Extensible Python: Robustness through Addition - PyCon 2024Extensible Python: Robustness through Addition - PyCon 2024
Extensible Python: Robustness through Addition - PyCon 2024
 

Testing Java Code Effectively - BaselOne17