[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EN255YHHTEJCSW39N5ZRKC":3,"skill-same:01M6EN255YHHTEJCSW39N5ZRKC":82},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6EN255YHHTEJCSW39N5ZRKC","pytest",null,"Python testing framework for writing simple, scalable, and powerful tests","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbossjones\u002Fpytest\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"testing","writing","python","python testing","run","framework","testing framework","write","async","simple","organize","fixtures","tests","Scalable","2026-11-10 10:12:30",false,"---\nname: pytest\ndescription: Python testing framework for writing simple, scalable, and powerful tests\nwhen_to_use: When you need to write, run, or organize Python tests with fixtures, parametrization, or async testing\n---\n\n# Pytest Testing Framework\n\nPytest is a mature Python testing framework that makes it easy to write small tests while scaling to support complex functional testing.\n\n## Quick Start\n\n### Basic Test Structure\n\n```python\n# test_example.py\ndef test_addition():\n    assert 2 + 2 == 4\n\ndef test_string_operations():\n    assert \"hello\".upper() == \"HELLO\"\n    assert \"world\" in \"hello world\"\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nuv run pytest\n\n# Run with verbose output\nuv run pytest -v\n\n# Run specific test file\nuv run pytest test_example.py\n\n# Run specific test function\nuv run pytest test_example.py::test_addition\n```\n\n## Common Patterns\n\n### Fixtures\n\n**Basic fixture definition:**\n\n```python\nimport pytest\n\n@pytest.fixture\ndef sample_data():\n    return {\"name\": \"Alice\", \"age\": 30}\n\ndef test_user_data(sample_data):\n    assert sample_data[\"name\"] == \"Alice\"\n    assert sample_data[\"age\"] == 30\n```\n\n**Fixture with setup and teardown:**\n\n```python\n@pytest.fixture\ndef database_connection():\n    # Setup\n    conn = create_database_connection()\n    yield conn\n    # Teardown\n    conn.close()\n\ndef test_database_query(database_connection):\n    result = database_connection.query(\"SELECT * FROM users\")\n    assert len(result) > 0\n```\n\n**Fixture scopes:**\n\n```python\n@pytest.fixture(scope=\"function\")  # Default - created per test\ndef temp_file():\n    pass\n\n@pytest.fixture(scope=\"module\")    # Created once per module\ndef module_resource():\n    pass\n\n@pytest.fixture(scope=\"session\")   # Created once per test session\ndef session_resource():\n    pass\n```\n\n### Parametrization\n\n**Basic parametrization:**\n\n```python\n@pytest.mark.parametrize(\"input,expected\", [\n    (\"3+5\", 8),\n    (\"2+4\", 6),\n    (\"6*9\", 54),\n])\ndef test_eval(input, expected):\n    assert eval(input) == expected\n```\n\n**Parametrized fixtures:**\n\n```python\n@pytest.fixture(params=[\"mysql\", \"postgresql\", \"sqlite\"])\ndef database(request):\n    if request.param == \"mysql\":\n        return MySQLConnection()\n    elif request.param == \"postgresql\":\n        return PostgreSQLConnection()\n    else:\n        return SQLiteConnection()\n\ndef test_database_operations(database):\n    # Test runs 3 times, once for each database type\n    result = database.execute(\"SELECT 1\")\n    assert result == 1\n```\n\n**Stacking parametrization for combinatorial testing:**\n\n```python\n@pytest.mark.parametrize(\"x\", [0, 1])\n@pytest.mark.parametrize(\"y\", [2, 3])\ndef test_combinations(x, y):\n    # Runs 4 times: (0,2), (0,3), (1,2), (1,3)\n    assert x + y > 1\n```\n\n### Async Testing\n\n**Basic async test:**\n\n```python\nimport pytest\n\n@pytest.mark.asyncio\nasync def test_async_function():\n    result = await async_operation()\n    assert result is not None\n```\n\n**Async fixtures:**\n\n```python\n@pytest.fixture\nasync def async_client():\n    client = AsyncClient()\n    await client.connect()\n    yield client\n    await client.disconnect()\n\n@pytest.mark.asyncio\nasync def test_async_api(async_client):\n    response = await async_client.get(\"\u002Fapi\u002Fdata\")\n    assert response.status_code == 200\n```\n\n### Test Organization\n\n**Using conftest.py for shared fixtures:**\n\n```python\n# conftest.py\n@pytest.fixture\ndef authenticated_client():\n    client = create_test_client()\n    client.login(\"testuser\", \"password\")\n    return client\n\n@pytest.fixture(scope=\"session\")\ndef test_database():\n    db = create_test_database()\n    yield db\n    db.cleanup()\n```\n\n**Test classes:**\n\n```python\nclass TestUserAPI:\n    def test_create_user(self, authenticated_client):\n        response = authenticated_client.post(\"\u002Fusers\", json={\"name\": \"John\"})\n        assert response.status_code == 201\n\n    def test_get_user(self, authenticated_client):\n        user_id = create_test_user()\n        response = authenticated_client.get(f\"\u002Fusers\u002F{user_id}\")\n        assert response.status_code == 200\n```\n\n### Mocking and Patching\n\n**Using monkeypatch fixture:**\n\n```python\ndef test_environment_variable(monkeypatch):\n    monkeypatch.setenv(\"API_KEY\", \"test-key\")\n    assert get_api_key() == \"test-key\"\n\ndef test_file_operations(monkeypatch, tmp_path):\n    test_file = tmp_path \u002F \"test.txt\"\n    test_file.write_text(\"test content\")\n\n    monkeypatch.setattr(\"module.FILE_PATH\", str(test_file))\n    assert read_file_content() == \"test content\"\n```\n\n### Markers and Selection\n\n**Custom markers:**\n\n```python\n# pytest.ini\n[tool:pytest]\nmarkers =\n    slow: marks tests as slow\n    integration: marks tests as integration tests\n    unit: marks tests as unit tests\n\n# test_file.py\n@pytest.mark.slow\ndef test_expensive_operation():\n    pass\n\n@pytest.mark.integration\ndef test_database_integration():\n    pass\n```\n\n**Running tests by marker:**\n\n```bash\n# Run only unit tests\nuv run pytest -m unit\n\n# Skip slow tests\nuv run pytest -m \"not slow\"\n\n# Run integration or unit tests\nuv run pytest -m \"integration or unit\"\n```\n\n## Practical Code Snippets\n\n### API Testing\n\n```python\nimport pytest\nfrom fastapi.testclient import TestClient\nfrom myapp import app\n\n@pytest.fixture\ndef client():\n    return TestClient(app)\n\n@pytest.fixture\ndef test_user():\n    return {\"username\": \"testuser\", \"email\": \"test@example.com\"}\n\ndef test_create_user(client, test_user):\n    response = client.post(\"\u002Fusers\u002F\", json=test_user)\n    assert response.status_code == 201\n    assert response.json()[\"username\"] == test_user[\"username\"]\n\ndef test_get_user(client, test_user):\n    # Create user first\n    create_response = client.post(\"\u002Fusers\u002F\", json=test_user)\n    user_id = create_response.json()[\"id\"]\n\n    # Get user\n    response = client.get(f\"\u002Fusers\u002F{user_id}\")\n    assert response.status_code == 200\n    assert response.json()[\"email\"] == test_user[\"email\"]\n```\n\n### Database Testing\n\n```python\nimport pytest\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\n\n@pytest.fixture(scope=\"function\")\ndef test_db():\n    engine = create_engine(\"sqlite:\u002F\u002F\u002F:memory:\")\n    Session = sessionmaker(bind=engine)\n    Base.metadata.create_all(engine)\n    session = Session()\n    yield session\n    session.close()\n\ndef test_user_creation(test_db):\n    user = User(name=\"John\", email=\"john@example.com\")\n    test_db.add(user)\n    test_db.commit()\n\n    retrieved_user = test_db.query(User).filter_by(name=\"John\").first()\n    assert retrieved_user.email == \"john@example.com\"\n```\n\n### Error Handling Testing\n\n```python\ndef test_invalid_input_raises_error():\n    with pytest.raises(ValueError, match=\"Invalid input\"):\n        process_input(\"invalid\")\n\ndef test_file_not_found():\n    with pytest.raises(FileNotFoundError):\n        read_nonexistent_file()\n\ndef test_custom_exception():\n    with pytest.raises(CustomAPIError) as exc_info:\n        call_api_endpoint()\n    assert exc_info.value.status_code == 404\n    assert \"not found\" in str(exc_info.value)\n```\n\n## Requirements\n\n- Python 3.7+\n- pytest (`uv add --dev pytest`)\n- For async testing: pytest-asyncio (`uv add --dev pytest-asyncio`)\n- For API testing: web framework test client (e.g., `uv add --dev httpx` for async HTTP tests)\n","# Pytest Testing Framework\n\nPytest is a mature Python testing framework that makes it easy to write small tests while scaling to support complex functional testing.\n\n## Quick Start\n\n### Basic Test Structure\n\n```python\n# test_example.py\ndef test_addition():\n    assert 2 + 2 == 4\n\ndef test_string_operations():\n    assert \"hello\".upper() == \"HELLO\"\n    assert \"world\" in \"hello world\"\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nuv run pytest\n\n# Run with verbose output\nuv run pytest -v\n\n# Run specific test file\nuv run pytest test_example.py\n\n# Run specific test function\nuv run pytest test_example.py::test_addition\n```\n\n## Common Patterns\n\n### Fixtures\n\n**Basic fixture definition:**\n\n```python\nimport pytest\n\n@pytest.fixture\ndef sample_data():\n    return {\"name\": \"Alice\", \"age\": 30}\n\ndef test_user_data(sample_data):\n    assert sample_data[\"name\"] == \"Alice\"\n    assert sample_data[\"age\"] == 30\n```\n\n**Fixture with setup and teardown:**\n\n```python\n@pytest.fixture\ndef database_connection():\n    # Setup\n    conn = create_database_connection()\n    yield conn\n    # Teardown\n    conn.close()\n\ndef test_database_query(database_connection):\n    result = database_connection.query(\"SELECT * FROM users\")\n    assert len(result) > 0\n```\n\n**Fixture scopes:**\n\n```python\n@pytest.fixture(scope=\"function\")  # Default - created per test\ndef temp_file():\n    pass\n\n@pytest.fixture(scope=\"module\")    # Created once per module\ndef module_resource():\n    pass\n\n@pytest.fixture(scope=\"session\")   # Created once per test session\ndef session_resource():\n    pass\n```\n\n### Parametrization\n\n**Basic parametrization:**\n\n```python\n@pytest.mark.parametrize(\"input,expected\", [\n    (\"3+5\", 8),\n    (\"2+4\", 6),\n    (\"6*9\", 54),\n])\ndef test_eval(input, expected):\n    assert eval(input) == expected\n```\n\n**Parametrized fixtures:**\n\n```python\n@pytest.fixture(params=[\"mysql\", \"postgresql\", \"sqlite\"])\ndef database(request):\n    if request.param == \"mysql\":\n        return MySQLConnection()\n    elif request.param == \"postgresql\":\n        return PostgreSQLConnection()\n    else:\n        return SQLiteConnection()\n\ndef test_database_operations(database):\n    # Test runs 3 times, once for each database type\n    result = database.execute(\"SELECT 1\")\n    assert result == 1\n```\n\n**Stacking parametrization for combinatorial testing:**\n\n```python\n@pytest.mark.parametrize(\"x\", [0, 1])\n@pytest.mark.parametrize(\"y\", [2, 3])\ndef test_combinations(x, y):\n    # Runs 4 times: (0,2), (0,3), (1,2), (1,3)\n    assert x + y > 1\n```\n\n### Async Testing\n\n**Basic async test:**\n\n```python\nimport pytest\n\n@pytest.mark.asyncio\nasync def test_async_function():\n    result = await async_operation()\n    assert result is not None\n```\n\n**Async fixtures:**\n\n```python\n@pytest.fixture\nasync def async_client():\n    client = AsyncClient()\n    await client.connect()\n    yield client\n    await client.disconnect()\n\n@pytest.mark.asyncio\nasync def test_async_api(async_client):\n    response = await async_client.get(\"\u002Fapi\u002Fdata\")\n    assert response.status_code == 200\n```\n\n### Test Organization\n\n**Using conftest.py for shared fixtures:**\n\n```python\n# conftest.py\n@pytest.fixture\ndef authenticated_client():\n    client = create_test_client()\n    client.login(\"testuser\", \"password\")\n    return client\n\n@pytest.fixture(scope=\"session\")\ndef test_database():\n    db = create_test_database()\n    yield db\n    db.cleanup()\n```\n\n**Test classes:**\n\n```python\nclass TestUserAPI:\n    def test_create_user(self, authenticated_client):\n        response = authenticated_client.post(\"\u002Fusers\", json={\"name\": \"John\"})\n        assert response.status_code == 201\n\n    def test_get_user(self, authenticated_client):\n        user_id = create_test_user()\n        response = authenticated_client.get(f\"\u002Fusers\u002F{user_id}\")\n        assert response.status_code == 200\n```\n\n### Mocking and Patching\n\n**Using monkeypatch fixture:**\n\n```python\ndef test_environment_variable(monkeypatch):\n    monkeypatch.setenv(\"API_KEY\", \"test-key\")\n    assert get_api_key() == \"test-key\"\n\ndef test_file_operations(monkeypatch, tmp_path):\n    test_file = tmp_path \u002F \"test.txt\"\n    test_file.write_text(\"test content\")\n\n    monkeypatch.setattr(\"module.FILE_PATH\", str(test_file))\n    assert read_file_content() == \"test content\"\n```\n\n### Markers and Selection\n\n**Custom markers:**\n\n```python\n# pytest.ini\n[tool:pytest]\nmarkers =\n    slow: marks tests as slow\n    integration: marks tests as integration tests\n    unit: marks tests as unit tests\n\n# test_file.py\n@pytest.mark.slow\ndef test_expensive_operation():\n    pass\n\n@pytest.mark.integration\ndef test_database_integration():\n    pass\n```\n\n**Running tests by marker:**\n\n```bash\n# Run only unit tests\nuv run pytest -m unit\n\n# Skip slow tests\nuv run pytest -m \"not slow\"\n\n# Run integration or unit tests\nuv run pytest -m \"integration or unit\"\n```\n\n## Practical Code Snippets\n\n### API Testing\n\n```python\nimport pytest\nfrom fastapi.testclient import TestClient\nfrom myapp import app\n\n@pytest.fixture\ndef client():\n    return TestClient(app)\n\n@pytest.fixture\ndef test_user():\n    return {\"username\": \"testuser\", \"email\": \"test@example.com\"}\n\ndef test_create_user(client, test_user):\n    response = client.post(\"\u002Fusers\u002F\", json=test_user)\n    assert response.status_code == 201\n    assert response.json()[\"username\"] == test_user[\"username\"]\n\ndef test_get_user(client, test_user):\n    # Create user first\n    create_response = client.post(\"\u002Fusers\u002F\", json=test_user)\n    user_id = create_response.json()[\"id\"]\n\n    # Get user\n    response = client.get(f\"\u002Fusers\u002F{user_id}\")\n    assert response.status_code == 200\n    assert response.json()[\"email\"] == test_user[\"email\"]\n```\n\n### Database Testing\n\n```python\nimport pytest\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\n\n@pytest.fixture(scope=\"function\")\ndef test_db():\n    engine = create_engine(\"sqlite:\u002F\u002F\u002F:memory:\")\n    Session = sessionmaker(bind=engine)\n    Base.metadata.create_all(engine)\n    session = Session()\n    yield session\n    session.close()\n\ndef test_user_creation(test_db):\n    user = User(name=\"John\", email=\"john@example.com\")\n    test_db.add(user)\n    test_db.commit()\n\n    retrieved_user = test_db.query(User).filter_by(name=\"John\").first()\n    assert retrieved_user.email == \"john@example.com\"\n```\n\n### Error Handling Testing\n\n```python\ndef test_invalid_input_raises_error():\n    with pytest.raises(ValueError, match=\"Invalid input\"):\n        process_input(\"invalid\")\n\ndef test_file_not_found():\n    with pytest.raises(FileNotFoundError):\n        read_nonexistent_file()\n\ndef test_custom_exception():\n    with pytest.raises(CustomAPIError) as exc_info:\n        call_api_endpoint()\n    assert exc_info.value.status_code == 404\n    assert \"not found\" in str(exc_info.value)\n```\n\n## Requirements\n\n- Python 3.7+\n- pytest (`uv add --dev pytest`)\n- For async testing: pytest-asyncio (`uv add --dev pytest-asyncio`)\n- For API testing: web framework test client (e.g., `uv add --dev httpx` for async HTTP tests)\n",{"name":5,"description":7,"when_to_use":48},"When you need to write, run, or organize Python tests with fixtures, parametrization, or async testing","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fbossjones\u002Fpytest",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill pytest",{"tool":64,"command":65},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill pytest",{"tool":67,"command":68},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill pytest","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbossjones\u002Fpytest\u002FSKILL.md",true,[72,78],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"agents\u002Fopenai.yaml","REFERENCE","参考文档",101,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fskills\u002Forc-rfc-writing\u002Fagents\u002Fopenai.yaml",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"skill-report.json",8732,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbossjones\u002Fpytest\u002Fskill-report.json",[83,95,105,114,120,127],{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":91,"publishedAt":43},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[92,93,94],"model","model hierarchy","model hierarchy skill",{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":101,"publishedAt":43},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[100],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[102,103,104],"MCP","zoom","zoom mcp",{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":43},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[111,112,113,103],"sdk","zoom apps sdk","apps",{"skillNo":115,"name":116,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":43},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[116],{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":126,"publishedAt":43},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[125],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[122],{"skillNo":128,"name":129,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":43},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[129]]