• Test Reliability

    When a test fails, the test should expose a fault in the system under test. Unfortunately, tests fail without exposing faults but rather due to test-order dependencies, nondeterminism in the code, network unreliability, overly-strong assumptions on APIs with weak specifications, etc. The aim of this line of research is to detect, debug, and repair such tests in order to make tests reliable.

  • Managing Software Change

    As software evolves faster than ever, it requires more rigorous techniques to ensure that a change does not modify existing behaviors in unintended ways. Differential program verification is one approach to achieve this goal. The aim of this line of research is to design new practical techniques to characterize the semantics of a change in order to ensure changes do not break existing functionality.

  • Regression Testing

    Are regression testing techniques which are agnostic to change still performing well when the software changes? Is their performance on par with change-aware regression testing techniques? We devised metrics to compare change-aware (Regression Test Selection) and change-agnostic techniques (Test-Suite Reduction); the data shows that change-aware techniques outperform the change-agnostic techniques.

  • Refactoring Imperative to Functional

    Java 8 introduces several functional features. Upgrading existing code to use those features provide great benefits. In this project we aim to automatically refactor imperative Java code to use new functional features such as lambda expressions and functional operations such as filter, map, reduce.

    Java 8 introduces two functional features: lambda expressions and functional operations like filter, map, or reduce that apply a lambda expression over the elements of a Collection. Refactoring existing code to use these new features enables explicit but unobtrusive parallelism and makes the code more succinct. However, refactoring is tedious (it requires changing many lines of code) and error-prone (the programmer must reason about the control-flow, data-flow, and side-effects). Fortunately, these refactorings can be automated.

    We present LAMBDAFICATOR, a tool which automates two refactorings. The first refactoring converts anonymous inner classes to lambda expressions. The second refactoring converts for loops that iterate over Collections to functional operations that use lambda expressions. In 9 open-source projects we have applied these two refactorings 1263 and 1595 times, respectively. The results show that LambdaFicator is effective.

    A video highlighting the main features can be found here.

    LambdaFicator is integrated in the official release of the NetBeans IDE. More info about the tool and how to use it are on refactoring.info.