Pytest官方教程-22-API参考-Objects

目录:

  1. 安装及入门
  2. 使用和调用方法
  3. 原有TestSuite使用方法
  4. 断言的编写和报告
  5. Pytest fixtures:清晰 模块化 易扩展
  6. 使用Marks标记测试用例
  7. Monkeypatching/对模块和环境进行Mock
  8. 使用tmp目录和文件
  9. 捕获stdout及stderr输出
  10. 捕获警告信息
  11. 模块及测试文件中集成doctest测试
  12. skip及xfail: 处理不能成功的测试用例
  13. Fixture方法及测试用例的参数化
  14. 缓存: 使用跨执行状态
  15. unittest.TestCase支持
  16. 运行Nose用例
  17. 经典xUnit风格的setup/teardown
  18. 安装和使用插件
  19. 插件编写
  20. 编写钩子(hook)方法
  21. 运行日志
  22. API参考
    1. 方法(Functions)
    2. 标记(Marks)
    3. 钩子(Hooks)
    4. 装置(Fixtures)
    5. 对象(Objects)
    6. 特殊变量(Special Variables)
    7. 环境变量(Environment Variables)
    8. 配置选项(Configuration Options)
  23. 优质集成实践
  24. 片状测试
  25. Pytest导入机制及sys.path/PYTHONPATH
  26. 配置选项
  27. 示例及自定义技巧
  28. Bash自动补全设置

API参考-Objects

对象(Objects)

完全参考可从Fixturs挂钩进入的物体。

CallInfo

*class *CallInfo[source]
结果/异常信息是一个函数调用。

Class

*class *Class[source]
基地: _pytest.python.PyCollector
收集器的测试方法。
collect()[来源]
返回此集合节点的子项(项和收集器)列表。

Collector

*class *Collector[source]
基地: _pytest.nodes.Node
收集器实例通过collect()创建子项,从而迭代地构建树。
异常CollectError[来源]
基地: Exception
收集期间出错,包含自定义消息。

collect()[来源]
返回此集合节点的子项(项和收集器)列表。

repr_failure(*excinfo *)[来源]
表示集合失败。

配置

class Config[source]
访问配置值,pluginmanager和插件钩子。
option
=无

访问命令行选项作为属性。(已弃用),请getoption()改用

pluginmanager=无
一个pluginmanager实例

add_cleanup(*func *)[来源]
添加一个在配置对象不使用时调用的函数(通常与pytest_unconfigure一致)。

classmethod fromdictargsoption_dict,*args *)[source]
构造函数可用于子进程。

addinivalue_line名称[来源]
在ini-file选项中添加一行。该选项必须已声明但可能尚未设置,在这种情况下,该行将成为其值中的第一行。

getini姓名[来源]
ini文件返回配置值。如果未通过先前parser.addini 调用(通常来自插件)注册指定的名称 ,则会引发ValueError。

skip = False *)[source]
返回命令行选项值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • name - 选项的名称。您也可以指定文字--OPT选项而不是“dest”选项名称。
  • default - 如果不存在该名称的选项,则为默认值。
  • skip - 如果选项不存在或具有None值,则为true raise pytest.skip。
    |

getvaluename,*path = None *)[来源]
(不推荐使用,请使用getoption())

getvalueorskipname,*path = None *)[来源]
(不推荐使用,使用getoption(skip = True))

异常信息

class ExceptionInfoexcinfostriptext ='',*traceback = None *)[来源]
包装sys.exc_info()对象并提供导航回溯的帮助。
*classmethod from_currentexprinfo = None *)[来源]
返回与当前回溯匹配的ExceptionInfo
警告
实验API
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | exprinfo - 一个文本字符串,帮助确定我们是否应该AssertionError从输出中剥离,默认为异常消息/__str__() |

*classmethod *for_later()[source]
返回一个未填充的ExceptionInfo

type
异常类

value
异常值

tb
异常原始追溯

typename
异常的类型名称

traceback
追溯

exconly(*tryshort = False *)[来源]
将异常作为字符串返回
当'tryshort'解析为True,异常是_pytest._code._AssertionError时,只返回异常表示的实际异常部分(因此'AssertionError:'从头开始删除)

errisinstance(*exc *)[来源]
如果异常是exc的实例,则返回True

getreprshowlocals = Falsestyle ='long'abspath = Falsetbfilter = Truefuncargs = Falsetruncate_locals = True,*chain = True *)[来源]
返回str()表示此异常信息。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • showlocalsbool) - 显示每个回溯条目的本地人。忽略如果style=="native"
  • stylestr) - long | short | no | native traceback style
  • abspathbool) - 如果路径应更改为绝对路径或保持不变。
  • tbfilterbool) - 隐藏包含局部变量的条目__tracebackhide__==True。忽略如果style=="native"
  • funcargsbool) - 为每个回溯条目显示固定装置(用于传统目的的“funcargs”)。
  • truncate_localsbool) - 使用showlocals==True,确保本地可以安全地表示为字符串。
  • chainbool) - 如果显示Python 3中的链接异常。
    |
    在版本3.9中更改:添加了chain参数。

match(*regexp *)[来源]
将正则表达式'regexp'与异常的字符串表示形式匹配。如果匹配则返回True(这样就可以写'assert excinfo.match()')。如果不匹配则引发AssertionError。

FixtureDef

*class *FixtureDef[source]
基地: object
工厂定义的容器。

FSCollector

*class *FSCollector[source]
基地: _pytest.nodes.Collector

功能

class Function[source]
基地:_pytest.python.FunctionMixin_pytest.nodes.Item_pytest.compat.FuncargnamesCompatAttr
功能项负责设置和执行Python测试功能。
originalname
=无

原始函数名称,没有任何装饰(例如参数"[...]"化为函数名称添加后缀)。
3.0版中的新功能。

function
底层python'函数'对象

runtest()[来源]
执行基础测试功能。

setup()[来源]
执行此测试功能的设置。

项目

class Item[source]
基地: _pytest.nodes.Node
一个基本的测试调用项。请注意,对于单个函数,可能存在多个测试调用项。
user_properties
=无

user属性是一个元组列表(名称,值),用于保存此测试的用户定义属性。

add_report_section何时关键内容[来源]
添加一个新的报表部分,类似于内部完成添加stdout和stderr捕获的输出:

item.add_report_section("call", "stdout", "report section contents")

<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • STR) -一个可能捕获的状态,"setup""call""teardown"
  • keystr) - 部分名称,可以随意定制。Pytest使用"stdout""stderr"内部。
  • contentstr) - 作为字符串的完整内容。
    |

MarkDecorator

*class MarkDecoratormark *)[source]
测试函数和测试类的装饰器。应用时,它将创建MarkInfo可以通过钩子作为项目关键字检索的对象 。MarkDecorator实例通常是这样创建的:

mark1 = pytest.mark.NAME              # simple MarkDecorator
mark2 = pytest.mark.NAME(name1=value) # parametrized MarkDecorator

然后可以作为装饰器应用于测试功能:

@mark2
def test_function():
    pass

调用MarkDecorator实例时,它会执行以下操作:

  1. 如果使用单个类作为其唯一的位置参数调用而没有其他关键字参数,则它会将自身附加到类,以便自动应用于该类中的所有测试用例。
  2. 如果使用单个函数作为唯一的位置参数调用而没有其他关键字参数,则会将MarkInfo对象附加到函数,其中包含已存储在MarkDecorator内部的所有参数。
  3. 当在任何其他情况下调用时,它执行“假构造”调用,即它返回一个新的MarkDecorator实例,其原始MarkDecorator的内容使用传递给此调用的参数进行更新。

注意:上述规则阻止MarkDecorator对象仅存储单个函数或类引用作为其位置参数,而不包含其他关键字或位置参数。
name
mark.name的别名

args
mark.args的别名

kwargs
mark.kwargs的别名

with_args(** args** kwargs *)[来源]
返回添加了额外参数的MarkDecorator
与调用不同,即使唯一参数是可调用/类,也可以使用它
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 返回: | MarkDecorator |

MarkGenerator

*class *MarkGenerator[source]
MarkDecorator对象的工厂- 作为pytest.mark单例实例公开。例:

import pytest
@pytest.mark.slowtest
def test_function():
   pass

将在MarkInfo对象上设置一个“最慢” 的test_function对象。

马克

class Markname:strargs,*kwargs *)[来源]

name=无
商标名称

args=无
标记装饰器的位置参数

kwargs=无
标记装饰器的关键字参数

combined_with其他[来源]
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | 其他马克) - 与之结合的商标 |
| 返回类型: | 标记 |
通过附加aargs和合并映射来组合

Metafunc

class Metafuncdefinitionfixtureinfoconfigcls = Nonemodule = None [来源]
Metafunc对象被传递给pytest_generate_tests钩子。它们有助于检查测试功能并根据测试配置或在定义测试功能的类或模块中指定的值生成测试。
config
=无

访问_pytest.config.Config测试Session的对象

module=无
定义测试函数的模块对象。

function=无
底层python测试功能

fixturenames=无
测试功能所需的夹具名称集

cls=无
在或中定义测试函数的类对象None

parametrizeargnamesargvaluesindirect = Falseids = None,*scope = None *)[来源]
使用给定argnames的argvalues列表向基础测试函数添加新调用。在收集阶段执行参数化。如果您需要设置昂贵的资源,请参阅设置间接,以便在测试设置时进行。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • argnames - 以逗号分隔的字符串,表示一个或多个参数名称,或参数字符串的列表/元组。
  • argvalues - argvalues列表确定使用不同参数值调用测试的频率。如果只指定了一个argname,则argvalues是值列表。如果指定了N个argnames,则argvalues必须是N元组的列表,其中每个tuple-element为其各自的argname指定一个值。
  • indirect - argnames或boolean的列表。参数列表名称(argnames的子集)。如果为True,则列表包含argnames中的所有名称。对应于此列表中的argname的每个argvalue将作为request.param传递到其各自的argname fixture函数,以便它可以在测试的设置阶段而不是在收集时执行更昂贵的设置。
  • ids - 字符串ID列表或可调用的列表。如果字符串,则每个字符串对应于argvalues,以便它们是测试ID的一部分。如果将None作为特定测试的id给出,则将使用该参数的自动生成的id。如果是可调用的,它应该采用一个参数(单个argvalue)并返回一个字符串或返回None。如果为None,将使用该参数的自动生成的id。如果没有提供id,它们将自动从argvalues生成。
  • 范围 - 如果指定,则表示参数的范围。范围用于按参数实例对测试进行分组。它还将覆盖任何fixture函数定义的范围,允许使用测试上下文或配置设置动态范围。
    |

模块

*class *Module[source]
基地:_pytest.nodes.File_pytest.python.PyCollector
测试类和函数的收集器。
collect()[来源]
返回此集合节点的子项(项和收集器)列表。

节点

class Node[source]
Collector的基类和测试集合树的Item。收集器子类有子节点,Items是终端节点。
name
=无

父节点范围内的唯一名称

parent=无
父收集器节点。

config=无
pytest配置对象

session=无
此节点所属的Session

fspath=无
收集此节点的文件系统路径(可以是None)

keywords=无
从所有范围收集的关键字/标记

own_markers=无
属于此节点的标记对象

extra_keyword_matches=无
允许添加额外的关键字以用于匹配

ihook
用于调用pytest钩子的fspath敏感钩子代理

warn警告[来源]
发出此项目的警告。
除非明确禁止,否则将在测试Session后显示警告
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | 警告警告) - 要发出的警告实例。必须是PytestWarning的子类。 |
| 举: | ValueError - 如果warning实例不是PytestWarning的子类。 |
用法示例:

node.warn(PytestWarning("some message"))

nodeid
a :: - 表示其集合树地址的分隔字符串。

listchain()[来源]
从收集树的根开始返回所有父收集器的列表。

add_markermarker,*append = True *)[来源]
动态地将标记对象添加到节点。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | 标记strpytest.mark.* 对象) - append=True是否附加标记,如果False插入位置0。 |

iter_markers名称=无[来源]
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | name - 如果给定,则按name属性过滤结果 |
迭代节点的所有标记

*for ... in iter_markers_with_nodename = None *)[来源]
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | name - 如果给定,则按name属性过滤结果 |
迭代节点的所有标记返回元组序列(节点,标记)

get_closest_marker名称默认=无[来源]
返回与名称匹配的第一个标记,从最近(例如函数)到更远级别(例如模块级别)。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • 默认 - 找不到标记的回退返回值
  • name - 要过滤的名称
    |

listextrakeywords()[来源]
在self和任何父母中返回一组所有额外的关键字。

addfinalizer(*fin *)[来源]
在最终确定此节点时注册要调用的函数。
只有在此节点在设置链中处于活动状态时才能调用此方法,例如在self.setup()期间。

getparent(*cls *)[来源]
获取下一个父节点(包括ownelf),它是给定类的一个实例

解析器

class Parser[source]
解析命令行参数和ini文件值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 变量: | extra_info - 泛型参数的字典 - >在处理命令行参数时出错的情况下显示的值。 |
getgroup
name
description ='',*after = None *)[来源]
获取(或创建)命名选项组。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 名称: | 选项组的名称。 |
| 描述: | -help输出的长描述。 |
| 后: | 其他组的名称,用于排序-help输出。 |
返回的组对象具有addoption与签名相同的方法,parser.addoption但将在输出中的相应组中显示。pytest. --help

addoption(** opts** attrs *)[来源]
注册命令行选项。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 选择采用: | 选项名称,可以是短期或长期期权。 |
| ATTRS: | 相同的属性,其中add_option()所述的功能 argparse库 接受。 |
在命令行解析选项在pytest配置对象上可用之后config.option.NAMENAME通常通过传递dest属性来设置,例如 。addoption("--long", dest="NAME", ...)

parse_known_argsargs,*namespace = None *)[来源]
此时解析并返回具有已知参数的命名空间对象。

parse_known_and_unknown_argsargs,*namespace = None *)[来源]
解析并返回具有已知参数的名称空间对象,此时其余参数未知。

addininamehelptype = None,*default = None *)[source]
注册ini文件选项。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 名称: | ini-variable的名称 |
| 类型: | 该变量的类型,可以是pathlistargslinelistbool。 |
| 默认: | 默认值,如果不存在ini-file选项但是被查询。 |
可以通过调用来检索ini变量的值 config.getini(name)

插件管理

class PluginManager[source]
Core Pluginmanager类,用于管理插件对象的注册和1:N钩子调用。
您可以通过致电注册新的挂钩add_hookspec(module_or_class)。您可以通过调用注册插件对象(包含挂钩) register(plugin)。Pluginmanager初始化为在注册的插件对象的dict名称中搜索的前缀。
出于调试目的,您可以调用enable_tracing() 哪个随后将调试信息发送到跟踪帮助程序。
register
插件
名称=无[来源]
如果名称被阻止注册,请注册插件并返回其规范名称或无。如果插件已注册,则引发ValueError。

unregisterplugin = None,*name = None *)[来源]
从内部数据结构取消注册插件对象及其所有包含的钩子实现。

set_blocked姓名[来源]
阻止给定名称的注册,如果已经注册,则注销。

is_blocked姓名[来源]
如果名称博客注册该名称的插件,则返回True。

add_hookspecs(*module_or_class *)[来源]
添加给定module_or_class中定义的新钩子规范。如果相应地修饰了功能,则会识别它们。

get_plugins()[来源]
返回已注册的插件集。

is_registered插件[来源]
如果插件已经注册,则返回True。

get_canonical_name插件[来源]
返回插件对象的规范名称。请注意,插件可以使用由register(plugin,name)的调用者指定的其他名称注册。要获取已注册插件的名称,请使用get_name(plugin)

get_plugin姓名[来源]
返回给定名称的插件或None。

has_plugin姓名[来源]
如果注册了具有给定名称的插件,则返回True。

get_name插件[来源]
注册插件的返回名称,如果未注册,则返回None。

check_pending()[来源]
验证所有未针对钩子规范验证的钩子是可选的,否则引发PluginValidationError

load_setuptools_entrypoints名称=无[来源]
从查询指定的setuptools加载模块group
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • groupstr) - 加载插件的入口点组
  • namestr) - 如果给定,只加载给定的插件name
    |
    | 返回类型: |
    INT
    |
    | 返回: |
    通过此调用返回加载的插件数。
    |

list_plugin_distinfo()[来源]
返回所有setuptools注册插件的distinguishedfo / plugin元组列表。

list_name_plugin()[来源]
返回名称/插件对的列表。

get_hookcallers插件[来源]
获取指定插件的所有钩子调用者。

add_hookcall_monitoring之前之后[来源]
在所有挂钩的跟踪功能之前/之后添加并返回一个撤销功能,当被调用时,将删除添加的跟踪器。
before(hook_name, hook_impls, kwargs) 将在所有挂钩调用之前调用并接收一个hookcaller实例,一个HookImpl实例列表和一个钩子调用的关键字参数。
after(outcome, hook_name, hook_impls, kwargs)接收相同的参数,before但也接收一个`_Result``表示整个钩子调用的结果的对象。

enable_tracing()[来源]
启用对钩子调用的跟踪并返回撤销功能。

subset_hook_callername,*remove_plugins *)[来源]
为命名方法返回一个新的_HookCaller实例,该方法管理除remove_plugins之外的所有已注册插件的调用。

PytestPluginManager

*class *PytestPluginManager[source]
基地: pluggy.manager.PluginManager
覆盖pluggy.PluginManager以添加特定于pytest的功能:

  • 从命令行加载插件,加载插件中的PYTEST_PLUGINSenv变量和 pytest_plugins全局变量;
  • conftest.py 在启动期间装载;
    addhooks(*module_or_class *)[来源]
    自2.8版以来已弃用。
    pluggy.PluginManager.add_hookspecs 改用。

parse_hookimpl_opts插件名称[来源]

parse_hookspec_optsmodule_or_class,*name *)[来源]

register插件名称=无[来源]
如果名称被阻止注册,请注册插件并返回其规范名称或无。如果插件已注册,则引发ValueError。

getplugin姓名[来源]

hasplugin姓名[来源]
如果注册了具有给定名称的插件,则返回True。

pytest_configure(*config *)[来源]

consider_preparse(*args *)[来源]

consider_pluginarg(*arg *)[来源]

consider_conftest(*conftestmodule *)[来源]

consider_env()[来源]

consider_module(*mod *)[来源]

import_pluginmodname,*consideration_entry_points = False *)[来源]
用插件导入插件modname。如果consider_entry_points为True,则还会将入口点名称视为查找插件。

Session

*class *Session[source]
基地: _pytest.nodes.FSCollector
异常Interrupted
基地: KeyboardInterrupt
发出中断的测试运行信号。

异常Failed
基地: Exception
在测试运行失败时发出停止信号。

*for ... in *collect()[source]
返回此集合节点的子项(项和收集器)列表。

TestReport

class TestReport[source]
基本测试报告对象(如果失败,也用于设置和拆除调用)。
nodeid
=无

规范化的集合节点ID

location=无
a(filesystempath,lineno,domaininfo)元组指示测试项的实际位置 - 它可能与收集的测试项不同,例如,如果方法是从不同的模块继承的。

keywords=无
name - > value字典,包含与测试调用关联的所有关键字和标记。

outcome=无
测试结果,总是“通过”,“失败”,“跳过”之一。

longrepr=无
无或失败表示。

when=无
'setup','call','teardown'之一表示测试阶段。

user_properties=无
user属性是一个元组列表(名称,值),用于保存用户定义的测试属性

sections=无
需要编组的额外信息对的列表。通过pytest用于添加从捕获的文本和,但是可以通过其它的插件可用于任意信息添加到报表。(str, str)``stdout``stderr

duration=无
只运行测试所花费的时间

classmethod from_item_and_callitem,*call *)
使用标准项和调用信息创建和填充TestReport的工厂方法。

caplog
如果启用了日志捕获,则返回捕获的日志行
版本3.5中的新功能。

capstderr
如果启用了捕获,则从stderr返回捕获的文本
3.0版中的新功能。

capstdout
如果启用了捕获,则从stdout返回捕获的文本
3.0版中的新功能。

count_towards_summary
试验
如果此报告应计入测试Session结束时显示的总计,则返回True:“1通过,1失败等”。
注意
此功能被认为是实验性的,因此请注意即使在修补程序版本中它也会发生变化。

head_line
试验
返回此报告的longrepr输出显示的头行,更常见的是在故障期间的回溯表示期间:

________ Test.foo ________

在上面的示例中,head_line是“Test.foo”。
注意
此功能被认为是实验性的,因此请注意即使在修补程序版本中它也会发生变化。

longreprtext
只读属性,返回完整的字符串表示形式longrepr
3.0版中的新功能。

[_result ]

class _Resultresult,*excinfo *)
result
获取此挂钩调用的结果(DEPRECATED支持get_result())。

force_result结果
强制结果result
如果挂钩被标记为firstresult单个值,则应设置否则设置(修改)结果列表。调用期间发现的任何异常都将被删除。

get_result()
获取此挂钩调用的结果。
如果钩子被标记为firstresult只有一个值,则返回结果列表。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容