I like the promise, and it looks nice. But I'm not sure what are the selling points.
- pytest already works with assert. Why brag about something that is already commonplace?
- It could help if your docs explained the alternative to using fixtures. I assume it would be done by re-using givens, but you could make it clearer what is the preferred way to do it, and what is gained, or lost, but doing it that way.
- Can you explain how your diff is better than the pytest diff? (I'm asking as someone who hates the pytest diff)
Thanks for the feedback, it helps me see things from a different perspective.
These are excellent questions, and you're absolutely right that they should be clear from the landing page. I'll work on fixing that.
Short answers:
1. Good point about asserts. When writing the benefits, I was targeting a broader audience (unittest users, people coming from other languages like JS), but the reality is most visitors are probably "pytest escapers" who already know pytest uses assert. I'll reorganize the selling points to focus on what actually differentiates Vedro.
2. The main philosophy is "all you need is functions and their compositions", no special decorators or dependency injection magic. But this is indeed missing from the index page. Will definitely add clear examples showing how to handle common fixture use cases with plain functions.
3. One diff example on the landing page clearly isn't enough. I'll add more comparisons. Since you hate pytest's diff output too, I'd love to hear what specifically bothers you about it, your pain points would be incredibly valuable for improving how I present Vedro's approach.
Because my hate for pytest is ardent and dear to my heart, I will try to explain.
I wrote a very simple function:
def test_whatever():
a = range(10)
b = (10 / x for x in a)
c = list(b)
When I run it with normal Python, this is the exception:
Traceback (most recent call last):
File "test_test.py", line 10, in <module>
test_whatever()
File "test_test.py", line 6, in test_whatever
c = list(b)
^^^^^^^
File "test_test.py", line 5, in <genexpr>
b = (10 / x for x in a)
~~~^~~
ZeroDivisionError: division by zero
It's compact and simple to understand. It pinpoints the exact location of the error, and I easily scan the text to find the function call-stack.
Now here's the pytest error:
___________________________________ test_whatever ___________________________________
def test_whatever():
a = range(10)
b = (10 / x for x in a)
> c = list(b)
test_test.py:6:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
.0 = <range_iterator object at 0x107695e90>
> b = (10 / x for x in a)
E ZeroDivisionError: division by zero
test_test.py:5: ZeroDivisionError
It doesn't pinpoint the error, it adds code lines that might be irrelevant, and extra information I don't care about.
I will say using `--tb=short` fixes most of it, at least in this example, and sometimes it's even preferable, because it's shorter. But it still doesn't pinpoint the error like normal Python exceptions do.
Thank you for sharing this example! You've perfectly captured one of my main frustrations: pytest tries to be "helpful" by adding extra context, but ends up obscuring the actual error.
- pytest already works with assert. Why brag about something that is already commonplace?
- It could help if your docs explained the alternative to using fixtures. I assume it would be done by re-using givens, but you could make it clearer what is the preferred way to do it, and what is gained, or lost, but doing it that way.
- Can you explain how your diff is better than the pytest diff? (I'm asking as someone who hates the pytest diff)