---
name: "Test::FailWarnings"
section: "3pm"
platform: "linux"
package: "perl-test-failwarnings"
version: "0.008-11"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Test::FailWarnings"
---

# Test::FailWarnings(3pm)

Add test failures if warnings are caught

## NAME

Test::FailWarnings - Add test failures if warnings are caught

## VERSION

version 0.008

## SYNOPSIS

Test file:

```
    use strict;
    use warnings;
    use Test::More;
    use Test::FailWarnings;
    ok( 1, "first test" );
    ok( 1 + "lkadjaks", "add non-numeric" );
    done_testing;
```

Output:

```
    ok 1 - first test
    not ok 2 - Test::FailWarnings should catch no warnings
    #   Failed test 'Test::FailWarnings should catch no warnings'
    #   at t/bin/main-warn.pl line 7.
    # Warning was 'Argument "lkadjaks" isn't numeric in addition (+) at t/bin/main-warn.pl line 7.'
    ok 3 - add non-numeric
    1..3
    # Looks like you failed 1 test of 3.
```

## DESCRIPTION

This module hooks `$SIG{__WARN__}` and converts warnings to Test::More `fail()` calls.  It is designed to be used with `"done_testing"`, when you don't need to know the test count in advance.

Just as with Test::NoWarnings, this does not catch warnings if other things localize `$SIG{__WARN__}`, as this is designed to catch *unhandled* warnings.

## USAGE

### Overriding $SIG{\_\_WARN\_\_}

On `"import"`, `$SIG{__WARN__}` is replaced with `"Test::FailWarnings::handler"`.

```
    use Test::FailWarnings;  # global
```

If you don't want global replacement, require the module instead and localize in whatever scope you want.

```
    require Test::FailWarnings;
    {
        local $SIG{__WARN__} = \&Test::FailWarnings::handler;
        # ... warnings will issue fail() here
    }
```

When the handler reports on the source of the warning, it will look past any calling packages starting with `"Carp"` or `"warnings"` to try to detect the real origin of the warning.

### Allowing warnings from dependencies

If you want to ignore failures from outside your own code, you can set `$Test::FailWarnings::ALLOW_DEPS` to a true value.  You can do that on the `"use"` line with `"-allow_deps"`.

```
    use Test::FailWarnings -allow_deps => 1;
```

When true, warnings will only be thrown if they appear to originate from a filename matching `"qr/^(?:t|xt|lib|blib)/"`

### Allowing warnings from specific modules

If you want to white-list specific modules only, you can add their package names to `@Test::NoWarnings::ALLOW_FROM`.  You can do that on the `"use"` line with `"-allow_from"`.

```
    use Test::FailWarnings -allow_from => [ qw/Annoying::Module/ ];
```

## SEE ALSO

- •

  Test::NoWarnings -- catches warnings and reports in an `"END"` block.  Not (yet) friendly with `"done_testing"`.

- •

  Test::Warnings -- a replacement for Test::NoWarnings that works with done\_testing

- •

  Test::Warn -- test for warnings without triggering failures from this modules

## SUPPORT

### Bugs / Feature Requests

Please report any bugs or feature requests through the issue tracker at \<https://github.com/dagolden/Test-FailWarnings/issues\>. You will be notified automatically of any progress on your issue.

### Source Code

This is open source software.  The code repository is available for public review and contribution under the terms of the license.

\<https://github.com/dagolden/Test-FailWarnings\>

```
  git clone https://github.com/dagolden/Test-FailWarnings.git
```

## AUTHOR

David Golden \<dagolden@cpan.org\>

## COPYRIGHT AND LICENSE

This software is Copyright (c) 2013 by David Golden.

This is free software, licensed under:

```
  The Apache License, Version 2.0, January 2004
```
