- Maintenance patches and API changes to skip/only category selection.
- Maintenance patch #27 updating source code conditional logic in the CLI argument parsing.
- Minor fixes for the most updated CI checks.
- Bug fix #24 where the bit-shift operators where not being applied during mutation trials and raised
KeyError
.- A new
test_all_op_types.py
ensures all mutation substitutions work as intended.
Mutatest
has reached a level of maturity to warrant a stable release. With the addition of the multiprocessing capabilities, support forcoverage
versions 4.x and 5.x, support for Python 3.7 and 3.8, being installable throughpip
orconda
, and with Azure Pipelines CI for platform tests, the tool and API are unlikely to change in a major way without moving to4.0.0
.New in this release:
- Multiprocessing support on Python 3.8!
- The new
--parallel
command argument will instructmutatest
to use multiprocessing for mutation trials. See the documentation for complete details.- Bug fix in
mutatest.cache.create_cache_dirs()
where the cache directory did not include "parents" in case of packages with nested directories without existing pycache.- Removal of the
sr
subcategory of slice mutations (Slice_RC
for range changes). These were rare, and supporting both Python 3.7 and 3.8 required excessive complexity. Thesu
category remains valid as the primary slice mutation set.
- Added support for specifying settings in
setup.cfg
using either[mutatest]
or[tool:mutatest]
sections in addition to themutatest.ini
file.
- Addressing test issues on Windows platform in the coverage tests by adding a
resolve_source
flag to theCoverageFilter.filter
method.
- Moved the
tests
directory to be within the package ofmutatest
. This enabled the installation to be tested withpytest --pyargs mutatest
as well aspytest
from local source files. Test dependencies are still installed withpip install .[tests]
.
- Includes specific test environments for
coverage
versions 4 and 5 with appropriate mocked.coverage
data outputs (JSON or SQL based on version).- A new
tox
test environment calledcov4
is added, with a newpytest
markerpytest.mark.coverage
for test selection.
Coverage
version 5.0 has moved to a SQLite database instead of a flat file. To support both 4x and 5x versions ofCoverage
thefilters
source code has been updated. The test suite includes mocked coverage data parsing tests of 4x only for now.
- Explicit including of
typing-extensions
insetup.py
requirements to fix breaking documentation builds on Python version 3.7 vs. 3.8.
- Python 3.8 support! There are breaking changes with the
LocIndex
and other components of thetransformers
from prior versions ofmutatest
. Python 3.8 introduces a new AST structure - including additional node attributesend_lineno
andend_col_offset
that have to be accounted for.transformers.MutateAST
is now build from a base class and a mixin class depending on the Python version (3.7 vs. 3.8) for the appropriate AST treatment. There are no changes in the CLI usage.
- Bugfix to ensure
exclude
path processing inGenomeGroup.add_folder
always uses full resolved paths for files.
- Feature #18: Allow mutation trials to time out. There are cases where a mutation could cause an infinite loop, such as changing the comparator in a
while
statement e.g.,while x < 5
becomeswhile x >= 5
. A new--timeout_factor
argument is added to set a cap on the maximum trial time as a multiplier of the clean-trial run.- Bugfix on using
exclude
where files were logged but still becoming part of the sample.
- Bug Fix #15: Fix
LocIndex.ast_class
setting forIndex
node mutations.
- Add support for a
mutatest.ini
configuration file for command line arguments.
- Documentation updates, including the API tutorial.
- Fix on latest
mypy
errors related tostrict
processing ofrun
andcache
.
- Moving from the alpha to the beta version with an API design. The alpha releases were focused on defining the functionality of the CLI. In the beta version, the CLI remains unchanged; however, a full internal design has been applied to create a coherent API. The
controller
,optimizers
, andmaker
modules have been fully replaced byrun
,api
, andfilters
. See the new full API documentation for details on using these modules outside of the CLI.- Additionally,
pytest
was removed from the installation requirements since it is assumed for the default running modes but not required for the API or installation.
- Added
--exception
and-x
as a survivor tolerance to raise an exception after the trial completes if the count of surviving mutants is greater than or equal to the specified value.
- Added
--only
and--skip
with category codes for mutation families.- Provides CLI selection of mutation types to be used during the trials.
- Added new
If
mutation:
- Original statements are represented by
If_Statement
and mutated to be eitherIf_True
where the statement always passes, orIf_False
where the statement is never passed.
- Breaking changes to the CLI arguments and new defaults:
- Output files are now optional, the default behavior has changed from always writing an RST file using the
-o
option on the command line.- Exclusions are still marked as
-e
; however, now multiple-e
arguments are supported and arguments must point to a Python file. The argument used to be:mutatest -e "__init__.py _devtools.py"
and now it ismutatest -e src/__init__.py -e src/_devtools.py
. There are no longer default exclusions applied.- Improved CLI reporting, including selected test counts and line/col locations for trial results while processing.
- Internal changes to
Slice
mutations for clearer categorization and report output.- Includes clearing names to
Slice_Swap
andSlice_RangeChange
for categories.- Updates operation names to
Slice_Unbounded...
with "lower" or "upper".
- Added new slice mutations:
Slice_SwapNoneUL
andSlice_SwapNoneLU
for swapping the upper and lower bound values when only one is specified e.g.x[1:]
tox[:1]
.Slice_UPosToZero
andSlice_UNegToZero
for moving the upper bound of a slice by 1 unit e.g.x[1:5]
becomesx[1:4]
.
- Added explicit tests for
argparse
cli options.- Added mechanism to sort reporting mutations by source file, then line number, then column number.
- Including
pytest
in the installation requirements. Technically, any test runner can be used but with all base package assumptions being built aroundpytest
this feels like the right assumption to call out as an install dependency. It is the default behavior.- Updated
controller
for test file exclusion to explicitly match prefix or suffix cases for"test_"
and"_test"
perpytest
conventions.- Changed error and unknown status results to console color as yellow instead of red.
- Added multiple invariant property tests, primarily to
controller
andcache
.- Added
hypothesis
to the test components ofextras_require
.- Moved to
@property
decorators for internal class properties that should only be set at initialization, may add customsetters
at a later time.- Fixed a zero-division bug in the
cli
when reporting coverage percentage.
- Addition of
optimizers
, including the new classCoverageOptimizer
.- This optimizer restricts the full sample space only to source locations that are marked as covered in the
.coverage
file. If you have apytest.ini
that includes the--cov=
command it will automatically generate during the clean-trial run.
- More behind the scenes maintenance: updated debug level logging to include source file names and line numbers for all visit operations and separated colorized output to a new function.
- Updated the reporting functions to return colorized display results to CLI.
- Added new mutation support for:
AugAssign
in AST e.g.+= -= *= /=
.Index
substitution in lists e.g. take a positive number likei[1]
and mutate to zero and a negative number e.g.i[-1] i[0]
.- Added a
desc
attribute totransformers.MutationOpSet
that is used in the cli help display.- Updated the cli help display to show the description and valid members.
- Added new mutation support for
NameConstant
in AST.- This includes substitutions for singleton assignments such as:
True
,False
, andNone
.- This is the first non-type mutation and required adding a
readonly
parameter to thetransformers.MutateAST
class. Additionally, the type-hints for theLocIndex
andMutationOpSet
were updated toAny
to support the mixed types. This was more flexible than a series ofoverload
signatures.
- Added new compare mutation support for:
Compare Is
mutations e.g.is, is not
.Compare In
mutations e.g.in, not in
.
Initial release!
Requires Python 3.7 due to the
importlib
internal references for manipulating cache.Run mutation tests using the
mutatest
command line interface.Supported operations:
BinOp
mutations e.g.+ - / *
including bit-operations.Compare
mutations e.g.== >= < <= !=
.BoolOp
mutations e.g.and or
.