Comments (9)
I may work on this, if it's still on track.
Two questions:
- do you agree on keeping pytest facilities as a third-party plugin (as in https://github.com/yohanboniface/pytest-falcon) ?
- do you feel comfortable with this kind of function based tests: https://github.com/etalab/ban/blob/master/ban/tests/http/?
Basically, I think such move should take two steps:
- switch to pytest as test runner; but keeping tests as they are
- moving to function based tests and
assert
based assertions little by little
Thoughts?
from falcon.
I totally think that testing without test classes (so essentially easy support for pytest) should be supported. @yohanboniface pytest-falcon looks cool, but I went with something really minimalistic and unopinionated with my project (with the thought of merging it into Falcon):
from falcon.testing import StartResponseMock, create_environ
def simulate_falcon_request(api, path='/', encoding=None, **kwargs):
"""Simulates a request to a `falcon.API`.
Args:
api (falcon.API): API object to send the request to.
path (str, optional): The path to request.
encoding (str, optional): If this is set to a character encoding,
such as 'utf-8', `simulate_falcon_request` will assume the
response is a single byte string, and will decode it as the
result of the request, rather than simply returning the
standard WSGI iterable.
kwargs (optional): Same as those defined for
`falcon.testing.create_environ`.
"""
resp_headers = StartResponseMock()
result = api(
create_environ(path=path, **kwargs),
resp_headers)
final_result = result
if encoding is not None:
if result:
final_result = result[0].decode(encoding)
else:
final_result = ''
return final_result, resp_headers
With the function above you can create helpers or partial functions that have some common defaults (encoding='utf-8', some Authorization header, etc.) and decrease the amount of code in tests. Those helpers could also go upstream.
I would also want to create a documentation page about testing including a few useful examples, because the current docs on readthedocs left me scratching my head for a while and going through the code when I was starting with Falcon. It would showcase both the old style of testing and the one I'd introduce.
But I need to know if there'll be interest in merging my changes. @kgriffs What do you say?
from falcon.
Circling back on this. Something along the lines of what @butla proposed would be cool, albeit using the new requests-like testing framework. Should be pretty straightforward to make some free functions and then have class methods that wrap them for backwards compat.
P.S. - I created a separate issue (#844) for migrating Falcon's own tests.
from falcon.
BTW, we should make sure we give an example in the docs of how to use a fixture to setup an api instance.
from falcon.
That was exactly what I had in mind :) Oh, and a side note: Hug also has an implementation of function-based Falcon testing.
from falcon.
OK, cool. I'd like to just have some basic py.test support in the framework out of the box, but others are free to create alternative, possibly more advanced solutions.
@butla did you have some bandwidth to implement this over the next couple of weeks? If not, I'd be happy to take it on. Just let me know. Thanks!
from falcon.
@kgriffs I'll probably not have the time in this and the next month, so good luck to you :)
from falcon.
Sounds good, I'll tackle it then. 👍
from falcon.
Added new free functions and a pytest-friendly helper class for simulating requests, and an example in the module docstring showing how to employ them via pytest.
from falcon.
Related Issues (20)
- `DefaultEventLoopPolicy.get_event_loop()` is deprecated (in the case of no loop) HOT 3
- Make contributor's checklist pass on CPython 3.12
- unable to iterate through `MultipartForm` multiple times HOT 2
- `http_date_to_dt()` should return a timezone-aware datetime
- Drop `--no-build-isolation` in testing
- IPv6 WSGI server fails to start
- Migrate to "pure Python" Cython mode where applicable HOT 3
- Make Python 3.12 the default CI version
- Docs facelift HOT 2
- Request: offer a way to validate `get_media()` as part of decoding the stream data to Python HOT 7
- Refactor CONSUME_MULTIPLE_SEGMENTS in BaseConverter HOT 1
- TestClient methods are typed to return _ResultBase, but actually return Result HOT 4
- TestClient sets buffered_stream, but not stream HOT 3
- Add support for 'partitioned' attribute to set_cookie() HOT 7
- Migrate to another code formatter? HOT 5
- Make it easier to extend/subclass default router
- Document how resp is affected by raising `HTTPError`/`HTTPStatus` HOT 3
- Generalize validators to support additional types of validation other than jsonschema HOT 2
- Use `ruff` linter instead of `flake8`
- Update installation docs wrt PEP 517
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from falcon.