(I think this is the right place for this suggestion, but please let me know if I'm mistaken)

There is currently no supported way to have some dependencies only used for testing (`swift test`), and the workarounds for it, while workable, are unnecessary crude.

Currently, what a lot of projects are doing is defining a `.Package.test.swift` file that is then copied over `Package.swift` when tests are to be run (on external CI, for example). While this works, it adds a extra step and another point of failure (if you forget to add a new dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either `testDependencies` or `devDependencies`, and the modules referenced within are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package` statements inside one Package file when trying to run tests, and keeps all dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to change for this to be added.

A real world example is a dependency on Quick (or another such testing framework), that itself uses XCTest, and thus crashes when being run outside of `swift test` (add Quick to Package.swift, run `swift build` and run the compiled binary). With the new `test[dev]Dependencies`, running `swift build` wouldn't even see Quick, and thus would compile and run correctly, but `swift test` would both see and use Quick for running the test suite.

Other solutions considered:
Another potential solution is to only compile the dependencies that were actually used when running `swift build`, since that seems to be the cause of the above problem.

(I think this is the right place for this suggestion, but please let me
know if I'm mistaken)

There is currently no supported way to have some dependencies only used
for testing (`swift test`), and the workarounds for it, while workable, are
unnecessary crude.

Currently, what a lot of projects are doing is defining a
`.Package.test.swift` file that is then copied over `Package.swift` when
tests are to be run (on external CI, for example). While this works, it
adds a extra step and another point of failure (if you forget to add a new
dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either
`testDependencies` or `devDependencies`, and the modules referenced within
are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package`
statements inside one Package file when trying to run tests, and keeps all
dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to
change for this to be added.

A real world example is a dependency on Quick (or another such testing
framework), that itself uses XCTest, and thus crashes when being run
outside of `swift test` (add Quick to Package.swift, run `swift build` and
run the compiled binary). With the new `test[dev]Dependencies`, running
`swift build` wouldn't even see Quick, and thus would compile and run
correctly, but `swift test` would both see and use Quick for running the
test suite.

*Other solutions considered:*
Another potential solution is to only compile the dependencies that were
actually used when running `swift build`, since that seems to be the cause
of the above problem.

(I think this is the right place for this suggestion, but please let me know if I'm mistaken)

There is currently no supported way to have some dependencies only used for testing (`swift test`), and the workarounds for it, while workable, are unnecessary crude.

Currently, what a lot of projects are doing is defining a `.Package.test.swift` file that is then copied over `Package.swift` when tests are to be run (on external CI, for example). While this works, it adds a extra step and another point of failure (if you forget to add a new dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either `testDependencies` or `devDependencies`, and the modules referenced within are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package` statements inside one Package file when trying to run tests, and keeps all dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to change for this to be added.

A real world example is a dependency on Quick (or another such testing framework), that itself uses XCTest, and thus crashes when being run outside of `swift test` (add Quick to Package.swift, run `swift build` and run the compiled binary). With the new `test[dev]Dependencies`, running `swift build` wouldn't even see Quick, and thus would compile and run correctly, but `swift test` would both see and use Quick for running the test suite.

Other solutions considered:
Another potential solution is to only compile the dependencies that were actually used when running `swift build`, since that seems to be the cause of the above problem.

The need for a feature such as this was pointed out some time ago. A
proposal to allow dependencies to be declared with increased granularity
has already been written, reviewed, and accepted! Here it is:https://github.com/apple/swift-evolution/blob/master/proposa
ls/0146-package-manager-product-definitions.md

(I think this is the right place for this suggestion, but please let me
know if I'm mistaken)

There is currently no supported way to have some dependencies only used
for testing (`swift test`), and the workarounds for it, while workable, are
unnecessary crude.

Currently, what a lot of projects are doing is defining a
`.Package.test.swift` file that is then copied over `Package.swift` when
tests are to be run (on external CI, for example). While this works, it
adds a extra step and another point of failure (if you forget to add a new
dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either
`testDependencies` or `devDependencies`, and the modules referenced within
are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package`
statements inside one Package file when trying to run tests, and keeps all
dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to
change for this to be added.

A real world example is a dependency on Quick (or another such testing
framework), that itself uses XCTest, and thus crashes when being run
outside of `swift test` (add Quick to Package.swift, run `swift build` and
run the compiled binary). With the new `test[dev]Dependencies`, running
`swift build` wouldn't even see Quick, and thus would compile and run
correctly, but `swift test` would both see and use Quick for running the
test suite.

*Other solutions considered:*
Another potential solution is to only compile the dependencies that were
actually used when running `swift build`, since that seems to be the cause
of the above problem.

It might be worth discussing this feature separately from product proposal because IMO the test-only (or local) dependencies should not be considered in dependency resolution. With product proposal we will *not* compile the targets which are not vended by a package but we will still clone and resolve all the dependencies. This means two packages can not depend on conflicting versions of Quick (which might not make sense for local dependencies).

(I think this is the right place for this suggestion, but please let me know if I'm mistaken)

There is currently no supported way to have some dependencies only used for testing (`swift test`), and the workarounds for it, while workable, are unnecessary crude.

Currently, what a lot of projects are doing is defining a `.Package.test.swift` file that is then copied over `Package.swift` when tests are to be run (on external CI, for example). While this works, it adds a extra step and another point of failure (if you forget to add a new dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either `testDependencies` or `devDependencies`, and the modules referenced within are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package` statements inside one Package file when trying to run tests, and keeps all dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to change for this to be added.

A real world example is a dependency on Quick (or another such testing framework), that itself uses XCTest, and thus crashes when being run outside of `swift test` (add Quick to Package.swift, run `swift build` and run the compiled binary). With the new `test[dev]Dependencies`, running `swift build` wouldn't even see Quick, and thus would compile and run correctly, but `swift test` would both see and use Quick for running the test suite.

Other solutions considered:
Another potential solution is to only compile the dependencies that were actually used when running `swift build`, since that seems to be the cause of the above problem.

It might be worth discussing this feature separately from product proposal because IMO the test-only (or local) dependencies should not be considered in dependency resolution. With product proposal we will *not* compile the targets which are not vended by a package but we will still clone and resolve all the dependencies. This means two packages can not depend on conflicting versions of Quick (which might not make sense for local dependencies).

(I think this is the right place for this suggestion, but please let me know if I'm mistaken)

There is currently no supported way to have some dependencies only used for testing (`swift test`), and the workarounds for it, while workable, are unnecessary crude.

Currently, what a lot of projects are doing is defining a `.Package.test.swift` file that is then copied over `Package.swift` when tests are to be run (on external CI, for example). While this works, it adds a extra step and another point of failure (if you forget to add a new dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either `testDependencies` or `devDependencies`, and the modules referenced within are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package` statements inside one Package file when trying to run tests, and keeps all dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to change for this to be added.

A real world example is a dependency on Quick (or another such testing framework), that itself uses XCTest, and thus crashes when being run outside of `swift test` (add Quick to Package.swift, run `swift build` and run the compiled binary). With the new `test[dev]Dependencies`, running `swift build` wouldn't even see Quick, and thus would compile and run correctly, but `swift test` would both see and use Quick for running the test suite.

Other solutions considered:
Another potential solution is to only compile the dependencies that were actually used when running `swift build`, since that seems to be the cause of the above problem.

Agree with Ankit's thought of `testDependencies` being a weird misnomer in
certain cases -- + 1 to something like `devDependencies` (Rust/Cargo/NPM
use this term) or `localDependencies`

Another thing I think that's important is the ability to clone/fetch all
your deps without building or without having to run a test process -- right
now we have `swift package fetch` -- it'd be great if this included these
local dependencies (or had an option flag to include them)

A good place to start would be writing the proposal in swift evolution format and posting it here.

I think we should call this feature localDependencies (instead of devDependencies) since these deps are local to a package. We should also mention the behaviour of local dependencies around pinning and editing.

It might be worth discussing this feature separately from product proposal because IMO the test-only (or local) dependencies should not be considered in dependency resolution. With product proposal we will *not* compile the targets which are not vended by a package but we will still clone and resolve all the dependencies. This means two packages can not depend on conflicting versions of Quick (which might not make sense for local dependencies).

(I think this is the right place for this suggestion, but please let me know if I'm mistaken)

There is currently no supported way to have some dependencies only used for testing (`swift test`), and the workarounds for it, while workable, are unnecessary crude.

Currently, what a lot of projects are doing is defining a `.Package.test.swift` file that is then copied over `Package.swift` when tests are to be run (on external CI, for example). While this works, it adds a extra step and another point of failure (if you forget to add a new dependency to both `Package` files, for example.

What I propose is a new section of `Package.swift`, labelled either `testDependencies` or `devDependencies`, and the modules referenced within are only loaded/compiled when running `swift test`

This solves having to manually switch out Package files or `.Package` statements inside one Package file when trying to run tests, and keeps all dependencies neatly organized in one file.

This change is purely additive and optional, no existing code needs to change for this to be added.

A real world example is a dependency on Quick (or another such testing framework), that itself uses XCTest, and thus crashes when being run outside of `swift test` (add Quick to Package.swift, run `swift build` and run the compiled binary). With the new `test[dev]Dependencies`, running `swift build` wouldn't even see Quick, and thus would compile and run correctly, but `swift test` would both see and use Quick for running the test suite.

Other solutions considered:
Another potential solution is to only compile the dependencies that were actually used when running `swift build`, since that seems to be the cause of the above problem.