TradingView
Guardian667
12 okt 2023 18:53

PineUnit 

Wall Street CFDFOREX.com

Beskrivning

PineUnit by Guardian667

A comprehensive testing framework for Pine Script on TradingView. Built with well-known testing paradigms like Assertions, Units and Suites. It offers the ability to log test results in TradingView's built-in Pine Protocol view, as well as displaying them in a compact table directly on your chart, ensuring your scripts are both robust and reliable.

Unit testing Pine Script indicators, libraries, and strategies becomes seamless, ensuring the precision and dependability of your TradingView scripts. Beyond standard function testing based on predefined input values, PineUnit supports series value testing. This means a test can run on every bar, taking into account its specific values. Moreover, you can specify the exact conditions under which a test should execute, allowing for series-based testing only on bars fitting a designated scenario.

Detailed Guide & Source Code

Quick Start
To get started swiftly with PineUnit, follow this minimalistic example.
import Guardian667/PineUnit/1 as PineUnit var testSession = PineUnit.createTestSession() var trueTest = testSession.createSimpleTest("True is always True") trueTest.assertTrue(true) testSession.report()

After running your script, you'll notice a table on your chart displaying the test results. For a detailed log output, you can also utilize the Pine Protocol view in TradingView.
-------------------------------------------------------------- T E S T S -------------------------------------------------------------- Running Default Unit Tests run: 1, Failures: 0, Not executed: 0, Skipped: 0

To further illustrate, let's introduce a test that's destined to fail:
var bullTest = testSession.createSeriesTest("It's allways Bull Market") bullTest.assertTrue(close > open, "Uhoh... it's not always bullish")

After executing, the test results will reflect this intentional discrepancy:
-------------------------------------------------------------- T E S T S -------------------------------------------------------------- Running Default Unit Tests run: 2, Failures: 1, Not executed: 0, Skipped: 0 <<< FAILURE! - in It's allways Bull Market Uhoh... it's not always bullish ==> expected: <true>, but was <false>

This shows how PineUnit efficiently captures and reports discrepancies in test expectations.

It's important to recognise the difference between `createSimpleTest()` and `createSeriesTest()`. In contrast to a simple test, a series-based test is executed on each bar, making assertions on series values.

License
This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org/MPL/2.0

@ Guardian667

A Personal Note
As a software developer experienced in OO-based languages, diving into Pine Script is a unique journey. While many aspects of it are smooth and efficient, there are also notable gaps, particularly in the realm of testing. We've all been there: using `plotchar()` for debugging, trying to pinpoint those elusive issues in our scripts. I've come to appreciate the value of writing tests, which often obviates the need for such debugging. My hope is that this Testing Framework serves you well and saves you a significant amount of time, more that I invested into developing this "baby."

Versionsinformation

v2
Fixed float comparison. Consider two na values as equal
Kommentarer
BobbyBanksX
thanks for the share.

i will work on getting some of this implemented and let you know how it goes! cheers.
Caversham
import Guardian667/PineUnit/1 as PineUnit var test_session = PineUnit.createTestSession() var test_case = test_session.createSeriesTest("Compare", 0, 2) blah1 = ta.sma(close, 14) blah2 = ta.sma(close, 14) test_case.assertEquals(blah1, blah2, 'A1') test_session.report()


The above produces the error: A1 ==> expected: na, but was na

Do you believe this is a bug? If not, how can I workaround (assuming I want to test both the pre-14 and post-14 bar indexes)?
Caversham
Should the "if (a == b)" be "if ((na(a) and na(b)) or a == b)" on line 28 (in the float version of equalsNa)?
Guardian667
@Caversham, You are correct. The epsilon-based comparison was one of the last things I have implemented and then I lost the checks for na values. Thanks a lot for the input. Patch will follow soon
Mer