Can we trust tests to automate dependency updates? A case study of Java Projects

by Hejderup, Joseph and Gousios, Georgios

You can get a pre-print version from here.
You can view the publisher's page here.
See the paper's associated code repository: jhejderup/uppdatera

Abstract

Developers are increasingly using services such as Dependabot to automate dependency updates. However, recent research has shown that developers perceive such services as unreliable, as they heavily rely on test coverage to detect conflicts in updates. To understand the prevalence of tests exercising dependencies, we calculate the test coverage of direct and indirect uses of dependencies in 521 well-tested Java projects. We find that tests only cover 58% of direct and 21% of transitive dependency calls. By creating 1,122,420 artificial updates with simple faults covering all dependency usages in 262 projects, we measure the effectiveness of test suites in detecting semantic faults in dependencies; we find that tests can only detect 47% of direct and 35% of indirect artificial faults on average. To increase reliability, we investigate the use of change impact analysis as a means of reducing false negatives; on average, our tool can uncover 74% of injected faults in direct dependencies and 64% for transitive dependencies, nearly two times more than test suites. We then apply our tool in 22 real-world dependency updates, where it identifies three semantically conflicting cases and three cases of unused dependencies that tests were unable to detect. Our findings indicate that the combination of static and dynamic analysis should be a requirement for future dependency updating systems.

Bibtex record

@article{HG22,
  title = {Can we trust tests to automate dependency updates? A case study of Java Projects},
  journal = {Journal of Systems and Software},
  volume = {183},
  pages = {111097},
  year = {2022},
  issn = {0164-1212},
  doi = {https://doi.org/10.1016/j.jss.2021.111097},
  author = {Hejderup, Joseph and Gousios, Georgios},
  keywords = {Semantic versioning, Library updates, Package management, Dependency management, Software migration},
  url = {https://arxiv.org/pdf/2109.11921.pdf},
  github = {jhejderup/uppdatera}
}

The paper