[swift-evolution] adding automated-testing of uncompilable features in XCTest
Derrick Ho
wh1pch81n at gmail.com
Sun Dec 11 23:10:45 CST 2016
It bugs me as well that we can not test private components using XCTest.
Objective-c never had this problem since privacy doesn't exist. I would
like to see a version of XCTest that allows us to test every component.
On Mon, Dec 12, 2016 at 12:02 AM Benjamin Spratling via swift-evolution <
swift-evolution at swift.org> wrote:
> Howdy,
> I’d like to see how much interest there is for adding these to the
> XCTest module. If I have missed some pro or con, or missed a technical
> point, your feedback is welcome before I go to the lengths to draw up a
> formal proposal.
>
>
> There are several features of Swift which cannot be effectively
> automated-tested.
> For instance, when a type or one of its members is private or file
> private, an outside test suite cannot access it, and the information that
> the type is private is not included in a Mirror. There are similar
> concerns for testability with internal, and public access levels. Tests
> can be written ensuring these access levels are >= some level, but not ==
> or < some level. In other words the very usefulness of these features
> cannot be tested.
>
> Other attributes to be tested in this way are:
>
> - Mutability of a member. No automated test can be written which verifies
> that a function cannot be called on a let struct, or that a property cannot
> be set at a specific access level.
>
> - That a stored property is weak or unowned.
>
> - That a class or class member is “final”
>
> These are concepts which need to be unit-tested to ensure good design is
> not broken, but do not need to be included in a release build, so including
> them in the XCTest framework seems like an appropriate destination.
> Moreover, the information for all of these features exists in the
> .swiftmodule files, which are included in test builds, but sometimes
> stripped for release.
>
> Examples:
> Since these features inherently have to do with testing features which
> cannot be stated in compiled code, I recommend specifying names with
> Strings. Here are some examples of what I would like to write in my test
> code:
>
> XCTAssertEqual(
> Module(named:”SingMusicLayout”)?.type(named:”NoteSetter”)?.property(named:”session”)?.accessLevel,
> .private)
>
> XCTAssertEqual(
> Module(named:”SingMusicLayout”)?.type(named:”ScaleLayout”)?.method(named:”baselineOffset(for:PitchInterval)->CGFloat”)?.mutable,
> false)
>
>
> Alternatives:
> 1. Building an independent .swiftmodule parser in a single Swift
> module, which can be included in test builds.
> + Can be distributed independently from Swift sources,
> requiring 0 buy-in from Swift community
> + requires a single additional module for the test.
> - Depends on ever-changing binary interface.
> : Intractable, not DRY
>
> 2. Use existing sourcekitd.
> + harnesses changes in the compiler’s source code with
> SourceKit
> - cannot be run in a test suite without extensive work by
> user to configure bundles explicitly.
> Exceptionally poor user experience
> : sourcekitd XPC architecture only works on macOS
>
> 3. Use a standalone tool for tests
> + harnesses changes in the compiler’s source code with
> SourceKit
> + no installation in user’s source code necessary
> : cannot be effectively run by SPM test infrastructure
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161212/44f8898e/attachment.html>
More information about the swift-evolution
mailing list