Содержание
Отчет о движении денежных средств: что это, методы анализа для инвесторов
Один из главных разделов финансовой отчетности — это отчет о движении денежных средств. Рассказываем, из чего он состоит и что инвестор может найти в нем полезного
Фото: Shutterstock
В этом тексте про ОДДС вы узнаете:
- Что это
- Структура
- Методы заполнения
- Возможности
Что такое отчет о движении денежных средств
Отчет о движении денежных средств (ОДДС, в англоязычных источниках — Cash Flow Statement) — один из основных документов, составляющих финансовую отчетность компании наряду с балансом, отчетом о прибылях и убытках и отчетом об изменениях в капитале.
www.adv.rbc.ru
Отчет о движении денежных средств — неотъемлемая часть годовой финансовой отчетности по российскому стандарту бухгалтерской отчетности (РСБУ). Компании, отчитывающиеся по международным стандартам финансовой отчетности (МСФО), заполняют ОДДС за каждый период отчетности, хотя ОДДС может не включаться в состав сокращенной отчетности по МСФО.
Если баланс детально показывает стоимость имущества и обязательств компании, отчет о прибыли — состав доходов и расходов, отчет об изменении капитала — за счет чего менялась стоимость имущества акционеров, то отчет о движении денежных средств позволяет детально увидеть, как по счетам компании проходили потоки «живых» денег — поступления и платежи.
В силу этого только отчет о движении денежных средств позволяет инвестору непосредственно увидеть сумму капитальных затрат, производимых компанией.
Отчет о движении денежных средств тесно увязан со статьей баланса, на которой учитываются деньги компании. Разница поступлений и платежей, отмеченная в отчете о движении денежных средств, будет и разницей между размером денежных средств на счетах компании в начале и в конце периода. Например, на начало на счетах компании было ₽10 млрд. В отчете о движении денежных средств зафиксировано, что в течение года у нее были поступления на сумму ₽60 млрд, а платежи — на сумму ₽50 млрд. Это значит, что ОДДС покажет чистое увеличение денежных средств и их эквивалентов на ₽10 млрд, а в балансе на конец года размер денежных средств и эквивалентов будет отмечен как ₽20 млрд.
ОДДС позволяет увидеть детализацию поступлений и платежей, причем группируя эти денежные потоки по их экономическому смыслу, что немаловажно для финансового анализа и принятия решений инвестором. Кроме того, с помощью отчета о движении денежных средств инвестор может увидеть, как компания зарабатывает «живые» деньги, проходящие по ее банковским счетам. Это позволит оценить реальные возможности компании по выплате дивидендов, по обеспечению займов и финансирования своей деятельности.
Структура отчета о движении денежных средств
Поступление денег на счет компании — это не всегда ее доходы. Доходом для компании будут деньги, поступившие за проданную продукцию. Но взятый кредит — это не доход компании, хотя это, несомненно, денежное поступление. Точно так же уменьшение денег на счетах после возврата компанией кредита не будет расходом при расчете прибыли. Чтобы денежные операции были разделены по смыслу, отчет о движении денежных средств состоит из трех основных разделов:
- Движение денежных средств от операционной деятельности;
- Движение денежных средств от инвестиционной деятельности;
- Движение денежных средств от финансовой деятельности.
В разделе, где учитываются денежные потоки от операционной деятельности, показываются результаты от платежей и поступлений компании от основной производственной и торговой деятельности. По РСБУ этот раздел называется «Денежные потоки от текущих операций». В этом разделе будут учтены поступления от продажи товаров и оказания услуг, а также платежи, составляющие расходы компании — за покупку материалов, оплата счетов за электроэнергию, оплата транспортных расходов, зарплаты работников и т. п.
Итогом этого раздела будет сумма чистых денежных средств, полученных от операционной (основной) деятельности. Он может считаться двумя методами — прямым и косвенным. Соответственно, заполнение статей этого раздела может вестись также прямым и косвенным методом. Мы еще вернемся к этому ниже.
В разделе «Движение денежных средств от инвестиционной деятельности» будут отмечены покупка компанией долгосрочных активов — оборудования, земли, лицензионных прав на месторождения и товарные знаки, а также затраты на строительство сооружений и зданий. Кстати говоря, эти затраты называются капитальными, или CAPEX (англ. capital expenditure). Помимо CAPEX, во втором разделе отчета о движении денежных средств, будут учтены деньги, отправленные на банковские депозиты, на покупку облигаций и акций, учреждение дочерних компаний и пр. Соответственно, в этом разделе будут отмечены и деньги, снятые с депозитов и вырученные за продажу облигаций и акций. Итогом второго раздела ОДДС будет сумма чистых денежных средств, полученных (выплаченных) от инвестиционной деятельности.
В разделе «Движение денежных средств от финансовой деятельности» будут отмечаться как денежные поступления взятые компанией кредиты и займы. В этом же разделе учитываются возврат взятых кредитов и выплата дивидендов акционерам компании. Аналогично предыдущим разделам ОДДС третьего раздела будет сумма чистых денежных средств, полученных (выплаченных) от финансовой деятельности.
Итогом всего отчета о движении денежных средств станет чистое увеличение (или уменьшение) денежных средств и их эквивалентов. Этот итог будет равен разнице между суммой денежных средств и их эквивалентов компании на конец и начало отчетного периода.
Методы заполнения ОДДС
Как мы уже говорили, есть два метода заполнения такого важного раздела ОДДС, как «Движение денежных средств от операционной деятельности»:
- прямой метод;
- косвенный метод.
Прямой метод
Прямой метод — это метод составления отчета о движении денежных средств, при котором платежи и поступления, которые связаны со статьями доходов и расходов компании, учитываются непосредственно. С бухгалтерской точки зрения в этот раздел попадают те операции, которые корреспондируют с балансовыми счетами денежных средств (расчетный счет и касса).
Этот метод называется еще «сверху вниз», то есть в отчете о движении денежных средств статьи поступлений и платежей будут идти в том же порядке, что и при расчете прибыли в отчете о прибыли и убытках. В ОДДС будут показаны аналогичные статьи денежных доходов и затрат — поступления от продажи товаров, платежи поставщикам, платежи на оплату труда.
Отчет о движении денежных средств по РСБУ «Северстали» за 2021 год
Главное отличие ОДДС и отчета о прибыли и убытках в том, что в ОДДС отражаются только денежные статьи. Такая статья затрат, как амортизация в отчете о движении денежных средств, прямым методом отображаться не будет, поскольку амортизация не проходит как платежи по счетам в этом периоде. Это так называемая неденежная статья расходов.
Разделы ОДДС «Движение денежных средств от инвестиционной деятельности» и «Движение денежных средств от финансовой деятельности» заполняются только прямым методом. РСБУ также требует использования только прямого метода заполнения отчета о движении денежных средств.
Косвенный метод
Косвенный метод — это метод составления отчета о движении денежных средств, при котором в разделе денежные потоки от операционной деятельности, указываются не сами платежи и поступления, а специальные корректировки прибыли. Этот метод называется иногда «снизу вверх». Дело в том, что раздел ОДДС «Денежные потоки от операционной деятельности» заполняется от прибыли компании — нижней, итоговой строки отчета о прибылях и убытках.
Отчет о движении денежных средств по МСФО Новолипецкого металлургического комбината за 2021 год
При заполнении этого раздела используются различные корректировки статей затрат и доходов из отчета о прибыли и убытке. То, что для компании доход, здесь учитывается со знаком минус, а то, что было затратами, здесь будет учитываться со знаком плюс. То есть чтобы отразить итог потока от операционной деятельности косвенным методом, к чистой прибыли прибавляются неденежные затраты (амортизация, отрицательные курсовые разницы, переоценка запасов и задолженностей). Неденежные доходы, такие, например, как положительная переоценка активов, наоборот, при заполнении вычитаются.
Кроме того, денежные расходы, учтенные как прочие или финансовые в отчете о прибылях и убытках, в ОДДС приводятся со знаком плюс. А вот денежные доходы, учтенные как прочие или финансовые, будут в ОДДС отмечены со знаком минус.
Для чего производятся такие, казалось бы, сложные действия? Во-первых, такой косвенный метод позволяет увидеть именно денежные поступления и платежи по операционной деятельности как итог расчетов. Во-вторых, и это самое важное, данный метод сразу позволяет сопоставить эти денежные итоги с неденежными статьями и косвенными доходами и расходами. То есть для инвестора косвенный метод сразу предлагает возможность анализа вопреки кажущейся сложности расчета. В отчетностях компаний по МСФО чаще всего встречается именно косвенный метод заполнения отчета о движении денежных средств.
Какие возможности для анализа дает отчет о движении денежных средств
Две возможности мы уже упоминали ранее:
- отчет о движении денежных средств непосредственно показывает размер производимых компанией капитальных затрат;
- косвенный метод заполнения отчета о движении денежных средств позволяет инвестору сопоставить именно денежный итог операционной деятельности с неденежными статьями или косвенными затратами и доходами. Это дает представление о финансовой устойчивости бизнеса компании, ее способности платить дивиденды.
Кроме того, сравнивая итоги движения денежных средств от операционной деятельности с другими разделами отчета о движении денежных средств, инвестор может оценить, насколько компания способна самостоятельно генерировать денежный поток. Сравнение такого самостоятельно сгенерированного потока с инвестиционным потоком поможет оценить возможности развития компании, финансирования капитальных затрат.
ОДДС позволяет быстро рассчитать такой специальный показатель, как свободный денежный поток, или FCF.
Свободный денежный поток
— это разница между чистым денежным потоком от операционной деятельности (итог первого раздела ОДДС) и капитальными затратами (первые статьи раздела о движении средств от инвестиционной деятельности).
Свободный денежный поток — это, по своей сути, остающиеся в распоряжении компании заработанные деньги на счетах. Определение этого показателя дает возможность инвестору понять такие моменты, как:
- возможность самостоятельного развития;
- необходимость и возможности компании в привлечении кредитов;
- реальную возможность компании выплачивать дивиденды.
Сопоставление по этим моментам может помочь инвестору принять инвестиционное решение при выборе акций конкурирующих компаний.
Следите за новостями компаний в нашей группе в сети «ВКонтакте»
Свободный денежный поток. Средства, оставшиеся у компании после уплаты всех операционных расходов.
В данном обзоре мы рассмотрим такой элемент системы как справочник Статьи движения денежных средств.
Данный справочник является мощным инструментом аналитического учета движения денег и часто используется в компаниях. Для того, чтобы включить возможность использования данного справочника в настройках раздела Деньги необходимо установить флаг Статьи движения денежных средств (ДДС). Именно этот флаг отвечает за то, что в вашей программе 1С:Управление нашей фирмой (1С:УНФ) будет доступен справочник и возможность учитывать деньги по в разрезе Статей ДДС. В разделе Деньги у вас появляется справочник Статьи движения денежных средств. Данный справочник иерархический. С помощью групп элементов можно выстраивать ту структуру, в соответствии с которой вы планируете вести учет своих денег. Например, в группе Платежи можно создать вложенную группу Коммерческие расходы. Уже в данной группе создать элемент Реклама, с использованием которого вы будете вести в дальнейшем учёт.
Где используется данный справочник? Во-первых в документах движения денег — это кассовые документы и документы по банку. В кассовых документах в подвале формы указывается статья движения денежных средств, которая действуют на весь документ. Если необходимо детализировать статьи движение денег по каждой строке, то для конкретной строки можно выбрать Статью ДДС, которая для данной строки будет учитываться индивидуально. Аналогичным образом в документах по банку мы видим, что присутствует статья движения денежных средств в подвале документа и присутствие статья движения денежных средств в табличной части нашего документа.
Другое место использования статей движения денежных средств — это подсистема планирования. В Заявках на расходование денег указывается статья по которой планируется расход денежных средств. После того как мы запланировали расход денег, мы можем увидеть данную информацию в Платежном календаре. В нем по статьям ДДС отображаются запланированные сумы.
Другое место использования движении денежных средств — это Бюджеты. В документах бюджетирования на вкладке Денежные средства указываются статьи движения денег. Проведя такой документ мы можем в отчетах смотреть как отображаются наши статьи движения денежных средств.
Во-первых отчет Движение денег. Это основной отчет, который показывает фактическое движение и в том числе по статьям ДДС. В данном отчёте мы видим наши статьи ДДС. Если в отчете необходимо вывести иерархию статей, то для группировки Статьи движения денежных средств устанавливает такой признак и теперь наш отчёт будет отображать всю структуру, которую мы настраивали в нашем справочнике. Данный вид более аналитичен и часто используется в учете и анализе. В отчете Динамика расхода денежных средств также видим наши статьи. По ним можно вывести диаграмму расхода денежных средств. В отчетах по бюджетированию нужно выбрать Сценарий планирования. В отчетах можно отобразить как плановые данные так и план-факт и отклонения в разрезе статей движения денежных средств.
| |
BDD Финансовые коэффициенты — FinancialModelingPrep
Текущий коэффициент | Currentassetscurrentliabilities \ dfrac {текущие активы} {текущие обязательства} currentliabilitiescurrentassets | — | Acculetiabilities. в состоянии покрыть свои текущие или краткосрочные обязательства. |
Коэффициент быстрой ликвидности | CashandCashEquivalents+ShortTermInvestments+AccountReceivablesCurrentLiabilities\dfrac{Cash and Cash Equivalents + Short Term Investments + Account Receivables}{Current Liabilities}CurrentLiabilitiesCashandCashEquivalents+ShortTermInvestments+AccountRece | — | Коэффициент быстрой ликвидности является более консервативным, чем коэффициент текущей ликвидности, поскольку он не включает товарно-материальные запасы и другие оборотные активы, которые, как правило, труднее превратить в денежные средства. Более высокий коэффициент быстрой ликвидности означает более ликвидную текущую позицию. |
Cash Ratio | CashandCashEquivalentsCurrentLiabilities\dfrac{Cash and Cash Equivalents}{Current пассивы}CurrentLiabilitiesCashandCashEquivalents собирается выйти из бизнеса. | ||
Количество дней невыплаченных продаж | (Дебиторская задолженность (начало) + Расчетная задолженность (конец))/2Доход/365\dfrac{(Дебиторская задолженность (начало) + Дебиторская задолженность (конец))/2}{Доход/365}Доход /365(AccountReceivable(start)+AccountReceivable(end))/2 | — | DSO сообщает вам, сколько дней после продажи в среднем требуется людям, чтобы заплатить вам. |
Остаток запасов в днях | (Запасы (начало) + Запасы (конец))/2COGS/365\dfrac{(Запасы (начало) + Запасы (конец))/2}{COGS/365}COGS/365 (Запасы(начало)+Запасы(конец))/2 | — | DIO сообщает, сколько дней в среднем запасы находятся на полке. |
Операционный цикл | DSO+DIO\dfrac{DSO + DIO}{}DSO+DIO | — | (DSO + DIO) сначала находясь в инвентаре до получения наличных после продажи. |
Дни непогашенной кредиторской задолженности | (Счета к оплате (начало) + Счета к оплате (конец))/2COGS/365\dfrac{(Счета к оплате (начало) + Счета к оплате (конец))/2}{COGS/365}COGS /365(Счета к оплате(начало)+Счета к оплате(конец))/2 | — | DPO сообщает вам, за сколько дней компания расплачивается со своими поставщиками. |
Цикл конверсии наличности | DSO+DIO-DPO\dfrac{DSO + DIO − DPO}{}DSO+DIO-DPO | — | Цикл конверсии наличности (CCC = DSO + DIO – DPO) измеряет количество дней, в течение которых денежные средства компании используются в процессе производства и продаж, и выгода, которую она получает от условий оплаты со стороны своих кредиторов. Чем короче этот цикл, тем ликвиднее оборотный капитал компании. CCC также известен как «денежный» или «операционный» цикл. |
Валовая прибыль прибыль | GrossProfitRevenue \ dfrac {Валовая прибыль} {Доход} Доход Grossprofit | оплачены прямые затраты, связанные с производством продукта. | |
Маржа операционной прибыли | OperatingIncomeRevenue\dfrac{Operating Income}{Revenue}RevenueOperatingIncome | — | Если компания может заработать на своей деятельности достаточно денег для поддержки бизнеса, ее обычно считают более стабильной. |
Маржа прибыли до налогообложения | IncomeBeforeTaxRevenue\dfrac{Доход до налогообложения}{Доход}RevenueIncomeBeforeTax | — | Получение прибыли является основной целью коммерческих организаций. Цель состоит в том, чтобы получать прибыль за счет роста и расти с каждым годом. В результате одной из важнейших ролей финансового и инвестиционного аналитика является отслеживание и прогнозирование прибыльности. |
Маржа чистой прибыли | NetIncomeRevenue\dfrac{Чистая прибыль}{Revenue}RevenueNetIncome | — | Как правило, маржа чистой прибыли, превышающая 10%, считается отличной, хотя это зависит от отрасли и структуры бизнеса. |
Эффективная налоговая ставка | ProvisionForIncomeTaxesIncomeBeforeTax\dfrac{Резерв по подоходному налогу}{Доход до налогообложения}IncomeBeforeTaxProvisionForIncomeTaxes | — | Если и есть один вывод, так это то, что налоговая ситуация компании сама по себе является живым, дышащим организмом. |
Рентабельность активов | NetIncomeAverageTotalAssets\dfrac{Чистый доход}{Average Total Assets}AverageTotalAssetsNetIncome | — | ROA Рентабельность активов дает представление о капиталоемкости компании, которая зависит от отрасли; компании, которые требуют больших первоначальных инвестиций, обычно имеют более низкую рентабельность активов. ROA выше 5% обычно считается хорошим. |
Рентабельность собственного капитала | NetIncomeAverageTotalEquity\dfrac{Чистый доход}{Average Total Equity}AverageTotalEquityNetIncome | — | ROE Этот коэффициент рассчитывает, сколько денег делается на основе инвестиций инвесторов в компанию. увидеть высокий коэффициент рентабельности собственного капитала, поскольку это указывает на то, что компания эффективно использует средства своих инвесторов. |
Рентабельность вложенного капитала | EBITAverageTotalAsset-AverageCurrentLiabilities\dfrac{EBIT}{Average Total Asset — Average Current Liabilities}AverageTotalAsset-AverageCurrentLiabilitiesEBIT | — | ROCE показывает инвесторам, сколько долларов прибыли приносит каждый доллар вложенного капитала. |
NIperEBT | NetIncomeEBT\dfrac{Чистый доход}{EBT}EBTNetIncome | — | NIperEBT. |
EBTperEBIT | EBTEBIT\dfrac{EBT}{EBIT}EBITEBT | — | EBTperEBIT. |
EBITperRevenue | EBITRvenue\dfrac{EBIT}{Revenue}RevenueEBIT | — | EBITperRevenue. |
Коэффициент долга | TotalliabiliteStalastasets \ dfrac {общие обязательства} {Всего активов} Total AssetTotalliability | — | . Помещение долгов рассказывает нам об этом. |
Доля собственного капитала | TotalDebtTotalEquity\dfrac{Total Debt}{Total Equity}TotalEquityTotalDebt против того, что акционеры совершили. 9В то время как 0007 | ||
Долгосрочная задолженность к капитализации | высокий коэффициент капитализации может увеличить рентабельность собственного капитала из-за налогового щита долга, более высокая доля долга увеличивает риск банкротства компании. | ||
Общий долг к капитализации | TotalDebtTotalDebt+ShareholdersEquity\dfrac{Total Debt}{Total Debt + акционерный капитал}TotalDebt+ShareholdersEquityTotalDebt | — | Коэффициент капитализации описывает для инвесторов степень, в которой компания использует заемные средства для финансирования своего бизнеса и планов расширения. |
Коэффициент покрытия процентов | EBITInterestExpense\dfrac{EBIT}{Процентные расходы}InterestExpenseEBIT | — | Чем ниже коэффициент покрытия процентов компании, тем большую нагрузку на нее несут расходы по долгу. |
Отношение денежного потока к долгу | Операционные денежные потокиОбщая задолженность\dfrac{Операционные денежные потоки}{Общая задолженность}Общая задолженностьОперационные денежные потоки | — | Отношение денежного потока к долгу показывает способность бизнеса поддерживать свои долговые обязательства за счет своих операционных денежных потоков. |
Множитель капитала компании | TotalAssetsTotalEquity\dfrac{Total Assets}{Total Equity}TotalEquityTotalAssets | — | Это мера финансового рычага. |
Оборот основных средств | RevenueNetPPE\dfrac{Revenue}{NetPPE}NetPPERevenue | — | Рассчитывает, насколько эффективно компания производит продажи с помощью своих машин и оборудования. |
Оборачиваемость активов | RevenueTotalAverageAssets\dfrac{Revenue}{Total Average Assets}TotalAverageAssetsRevenue | — | Коэффициент оборачиваемости активов часто может использоваться как показатель эффективности, с которой компания использует свои активы. доход. |
Операционный денежный поток Соотношение продаж | OperatingCashFlowRevenue\dfrac{Operating Cash Flow}{Revenue}RevenueOperatingCashFlow | — | Дает инвесторам представление о способности компании превращать продажи в денежные средства. |
Свободный денежный поток Коэффициент операционных денежных потоков | FreeCashFlowOperatingCashFlow\dfrac{Свободный денежный поток}{Операционный денежный поток}OperatingCashFlowFreeCashFlow увеличить финансовую устойчивость компании. | ||
Коэффициенты покрытия денежных потоков | OperatingCashFlowTotalDebt\dfrac{Operating Cash Flow}{Total Debt}TotalDebtOperatingCashFlow | — | Операционный денежный поток — это просто сумма денежных средств, полученных компанией от ее основной деятельности, которая используется для финансирования бизнеса. |
Коэффициенты краткосрочного покрытия | Операционный поток денежных средствShort-TermDebt\dfrac{Операционный денежный поток}{Краткосрочный долг}Short-TermDebtOperatingCashFlow | — | Коэффициент покрытия краткосрочной задолженности сравнивает сумму краткосрочных займов компании и текущей части ее долгосрочной задолженности с операционным денежным потоком. |
Коэффициенты покрытия капитальных расходов | OperatingCashFlowCapitalExpenditure\dfrac{Operating Cash Flow}{Capital Expenditure}CapitalExpenditureOperatingCashFlow | — | |
Выплаченные дивиденды и коэффициенты покрытия капитальных затрат | Операционный поток денежных средствDividendPaid+CapitalExpenditure\dfrac{Операционный денежный поток}{Выплаченные дивиденды + капитальные затраты}DividendPaid+CapitalExpenditureOperatingCashFlow | — | отношения капитальных затрат компании и денежных дивидендов к ее операционному денежному потоку является строгой мерой, которая подвергает денежный поток окончательному испытанию. Если компания способна покрыть оба этих расхода средств из внутренних источников и при этом у нее еще остаются наличные деньги, она производит то, что можно было бы назвать «свободным денежным потоком на стероидах». Это обстоятельство является весьма благоприятным инвестиционным качеством. |
Коэффициент выплаты дивидендов | DPS(DividendperShare)EPS(NetIncomeperShareNumber\dfrac{DPS (Dividend per Share)}{EPS (Чистый доход на акцию Number}EPS(NetIncomeperShareNumberDPS(DividendperShare) | — 9000 Выплата дивидендов |
Price Balance Value Ratio0007 | — | Отношение цены к балансовой стоимости, выраженное как кратное (т. е. сколько раз акции компании торгуются в расчете на одну акцию по сравнению с балансовой стоимостью компании в расчете на одну акцию), является показателем того, сколько акционеры платят за чистые активы компании. | |
Цена Коэффициент денежного потока | StockPriceperShareOperatingCashFlowperShare\dfrac{Цена акции на акцию}{Операционный денежный поток на акцию}OperatingCashFlowperShareStockPriceperShare | — | Соотношение цена/денежный поток используется инвесторами для оценки инвестиционной привлекательности с точки зрения стоимости акций компании. |
Соотношение цены и прибыли | StockPriceperShareEPS\dfrac{Цена акции на акцию}{EPS}EPSStockPriceperShare текущую цену акции для расчета мультипликатора P/E (т. е. сколько раз акция торгуется (ее цена) на каждый доллар прибыли на акцию). | ||
Отношение цены и прибыли к росту | PriceEarningsRatioExpectedRevenueGrowth\dfrac{PriceEarningsRatio}{Ожидаемый рост дохода}ExpectedRevenueGrowthPriceEarningsRatio роста в его текущую оценку. По общему мнению, если коэффициент PEG указывает значение 1, это означает, что рынок правильно оценивает (текущий коэффициент P/E) акции в соответствии с текущей расчетной прибылью акции на рост акции . Если коэффициент PEG меньше 1, это означает, что рост прибыли на акцию потенциально может превзойти текущую рыночную оценку. Другими словами, цена акции недооценена. С другой стороны, акции с высоким коэффициентом PEG могут указывать как раз на обратное — на то, что акции в настоящее время переоценены. | ||
Коэффициент продаж | StockPriceperShareRevenueperShare\dfrac{Цена акции на акцию}{Доход на акцию}RevenueperShareStockPriceperShare продаж компании. Поскольку прибыль в той или иной степени зависит от бухгалтерских оценок и манипулирования руководством, многие инвесторы считают показатель продаж (выручки) компании более надежным компонентом коэффициента при расчете мультипликатора цены акции, чем показатель прибыли. | ||
Доходность по дивидендам | DividendperShareStockPriceperShare\dfrac{Дивиденд на акцию}{Цена акции на акцию}StockPriceperShareDividendperShare большой прирост капитала. Каким бы ни был ваш стиль инвестирования, исторически сложилось, что акции, приносящие дивиденды, в долгосрочной перспективе показали лучшие результаты, чем акции, не приносящие дивиденды. | ||
Мультипликатор стоимости предприятия | EntrepriseValueEBITDA\dfrac{Entreprise Value}{EBITDA}EBITDAEntrepriseValue | — | В целом, это измерение позволяет инвесторам оценивать компанию на той же основе, что и покупатель. При грубом расчете мультипликатор стоимости предприятия служит показателем того, сколько времени потребуется для того, чтобы поглощение заработало достаточно, чтобы окупить свои затраты в течение нескольких лет (при условии отсутствия изменений в EBITDA). |
Цена Справедливая стоимость | StockPriceperShareIntrinsicValue\dfrac{Цена акции за акцию}{Внутренняя стоимость}IntrinsicValueStockPriceperShare | — | Помогает инвесторам определить, торгуется ли акция ниже или выше ее оценки справедливой стоимости. акции торгуются с дисконтом к их справедливой стоимости, в то время как коэффициент выше 1 предполагает, что они торгуются с премией к своей справедливой стоимости. |
Как исправить цепочки зависимостей в ваших сценариях.
Последней задачей было разбить цепочку сценариев, каждый из которых устанавливал контекст для следующего. Подробное объяснение проблемы см. в исходном сообщении. Эта статья содержит анализ ответов сообщества и советы по более общим подходам к решению подобных проблем.
Цепочка сценариев имеет много недостатков, но этот проблематичный способ написания сохраняется, потому что он также имеет два больших преимущества: на сцену для следующего.
Несколько человек предложили решить задачу, включив части предыдущих сценариев непосредственно в более поздние. Это устраняет зависимость времени выполнения, поэтому сценарии могут выполняться независимо, но на самом деле не решают другие основные проблемы. Он также теряет преимущество быстрого исполнения. Чтобы полностью решить эту проблему, нам нужно исправить недостатки, но сохранить преимущества. Большая проблема с переписыванием ручных тестов в «Дано/Когда/Тогда» заключается в том, что их нужно по-разному оптимизировать для участия человека.
Ручные тесты должны быть оптимизированы для участия человека во время выполнения. Нельзя тратить время на настройку одного и того же дела снова и снова только для того, чтобы попробовать немного другой вариант. Но человек также может скорректировать ожидания во время тестового прогона. Если сценарий в цепочке дает сбой и в системе остаются неожиданные данные, тестер может легко скорректировать свои ожидания для последующих тестов. Машина не может.
Автоматические тесты должны быть оптимизированы для участия человека при устранении неполадок. После первоначального написания люди в основном участвуют в автоматизированных тестах только тогда, когда они терпят неудачу или нуждаются в изменении. Сцепленные сценарии затрудняют устранение неполадок после сбоя, поскольку людям приходится анализировать всю последовательность выполнения, чтобы понять, что пошло не так. Изменение связанных сценариев также намного сложнее, чем изолированных, поскольку кто-то может непреднамеренно нарушить контекст для многих сценариев, обновив что-то в середине цепочки.
Чтобы не терять время, люди должны понимать, модифицировать и выполнять каждый сценарий независимо друг от друга. Длительные настройки тестов могут быть проблемой, но мы можем решить эту проблему несколькими способами после того, как тесты будут автоматизированы. Тривиальным решением было бы сделать каждый тест независимым, а затем запускать их параллельно на большем количестве оборудования. Тем не менее, есть лучшие способы ускорить процесс, но они зависят от другого подхода к написанию сценариев.
Сгруппируйте связанные примеры вместе
Первым шагом в переписывании длинной цепочки обычно является понимание зависимостей между сценариями. Вместо того, чтобы использовать один сценарий для подготовки сцены для другого, мы можем определить группы связанных сценариев, а затем настроить контекст только один раз для каждой группы. Это может значительно ускорить выполнение, но при этом сохранить относительную независимость каждого сценария.
Якуб Новак предложил перенести регистрацию на фон файла функций, полностью удалив первый сценарий и запуская каждый сценарий с той точки системы, где пользователю необходимо войти в систему.
Фон: Учитывая, что пользователь зарегистрирован как «mike99». ... Сценарий: (3) зарегистрируйте способ оплаты Данный пользователь входит в систему как «mike99» И пользователь добавляет способ оплаты "Visa" с номером карты "4242424242424242" . ..
Прелесть этого подхода в том, что фоновая автоматизация шага может отслеживать действия пользователя. Он может добавить пользователя только при первом запуске, но пропустить его для последующих сценариев и ускорить выполнение. Потенциально мы могли бы даже удалить имя пользователя, поскольку оно не так важно для трех сценариев, связанных с покупками, но последний сценарий в исходном посте не позволяет нам это сделать. Ему нужно конкретное имя пользователя, чтобы он мог проверить дублирование. Это хороший намек на то, что нам, возможно, следует поискать другой способ группировки примеров.
Том Роден предложил разделить сценарии на основе бизнес-правил, которые они тестируют. В примере сценария из исходного поста сценарии 1 и 5 проверяют регистрацию пользователя. Сценарии 2, 3 и 4 касаются проверки пользователя. Мы можем попробовать реструктурировать спецификацию вокруг этих двух групп.
Если вы не можете угадать бизнес-правила, которые тестируются в сценариях, поищите похожие триггеры ( Когда шагов). Группировка сценариев на основе тестируемого действия обычно позволяет значительно упростить настройку, так как сценарии в таких группах обычно нуждаются в сходной информации. Затем мы можем иметь конкретное имя пользователя для сценариев регистрации и не указывать ничего, связанного с пользователем, для сценариев покупки. Точно так же содержимое корзины не имеет значения для сценариев регистрации, поэтому мы можем не упоминать об этом.
Одна функция в файле
В ответ на предыдущий вызов Фейт Петерсон предложила реструктурировать спецификацию функции в несколько файлов. Сценарий в предыдущем испытании, возможно, не оправдывал такое изменение, но это, безусловно, оправдывает. У нас здесь две совершенно разные темы, и смысла держать их вместе практически нет — кроме экономии времени на настройку контекста.
Люди часто смешивают разные функции в одном файле, потому что хотят иметь четкую связь между рабочим элементом (например, пользовательской историей) и связанными с ним сценариями. Наличие одного файла функций для каждого рабочего элемента позволяет удобно решать, когда пользовательская история готова, и перечислять все изменения или тесты, связанные с пользовательской историей. Однако этот подход имеет существенные недостатки в долгосрочной перспективе.
Многие пользовательские истории могут со временем повлиять на одну функцию. Распределение знаний по нескольким файлам затрудняет анализ текущей спецификации этой функции. Это также затрудняет изменение всех связанных сценариев при развитии функции. Чтобы упростить работу с файлами функций в долгосрочной перспективе, я настоятельно рекомендую организовывать файлы вокруг функций, а не историй. Не храните более одной темы в одном файле, так как они, скорее всего, будут развиваться независимо друг от друга.
Знать, какие сценарии связаны с отдельной историей, иногда важно, но есть способы сделать это получше. Распространенным обходным решением является использование тегов в сценариях или функциях, чтобы связать их с рабочими элементами. Например, чтобы показать, что сценарий относится к истории 1912 в JIRA, мы можем пометить сценарий следующим образом:
@JRA-1912. Сценарий: Оформление заказа
Теги доступны в большинстве инструментов Given/When/Then. Specflow, в частности, также имеет удобную поддержку прямой ссылки на элементы в Azure DevOps.
Декларативное описание настройки
Вместо того, чтобы просто разбивать сценарии на несколько файлов, мы также должны переписать их, чтобы они имели больше смысла. Хотя я предпочитаю избегать сравнения «Дано/Когда/Тогда» с языками программирования, есть одна область, где эта связь имеет смысл, — противопоставление декларативного и императивного стилей.
Вообще говоря, существует два типа языков программирования. Императивные языки (такие как Java, C# или JavaScript) определяют алгоритм, используя последовательность действий, которые должен выполнять компьютер. Они определяют реализацию. Декларативные языки (такие как Prolog или большинство SQL) определяют намерение работы, не определяя последовательность действий. Декларативный код более ограничен, чем императивный, с точки зрения действий, которые он может выполнять (Prolog может выполнять только логические выводы, SQL может только манипулировать табличными данными). С другой стороны, для ограниченных областей, где он работает, декларативный код часто легче понять, изменить и выполнить. Это именно те преимущества, которые мы хотим получить от сценариев.
Декларативный код оставляет реализацию алгоритма интерпретатору или компилятору языка, поэтому все виды замечательных оптимизаций могут применяться в зависимости от контекста. Один и тот же SQL-запрос может выполняться совершенно по-разному в маленькой таблице из 10 записей или в гигантской таблице, состоящей из миллионов записей на разных осколках с несколькими индексами. Человеку, пишущему SQL-запрос, обычно не нужно заботиться об этом. Точно так же тому, кто пишет спецификацию функций, не нужно заботиться о том, как выполняется тест.
Насколько это возможно, старайтесь определять сценарии декларативным образом. Это особенно важно для предусловий ( Дано ) и постусловий ( Тогда ). Декларативные операторы обычно короче императивных, и такие сценарии легче понять и модифицировать. Императивные шаги вынуждают автоматизацию следовать очень специфическому потоку, поэтому люди, автоматизирующие тесты, не могут его сильно оптимизировать. Декларативные шаги позволяют разработчикам оптимизировать выполнение тестов в зависимости от контекста. Например, вместо того, чтобы регистрировать пользователя через веб-приложение, автоматизация тестирования может просто вставить запись пользователя непосредственно в базу данных. Это может значительно ускорить тестирование.
В контексте исполняемых спецификаций разница между императивными и декларативными часто объясняется как как и что . Сценарии должны описывать, что должна делать система, а не объяснять, как выполняется тест. Один из хороших способов — избегать активных глаголов в разделах Given и Then . Не указывайте настройку, когда пользователь что-то делает, например:
При условии, что пользователь добавляет «Истории, которые прилипают» в корзину
Вместо этого объясните состояние системы. Виктор Коски предложил следующие декларативные способы определения сценариев:
Сценарий: (3) зарегистрируйте способ оплаты. Учитывая выполненный заказ и ожидающий добавления способа оплаты ... Сценарий: (4) оформить заказ с помощью существующего способа оплаты Учитывая выполненный заказ и способ оплаты ...
Декларативное создание сценариев позволяет уменьшить беспорядок и сосредоточиться на том, что действительно важно в каждой группе сценариев. Затем мы можем обнаружить общие черты и различия между примерами и легко удалить дублирование.
Извлечение схемы сценария
В рамках первой задачи я предложил преобразовать группу похожих сценариев в схему сценария. Мы можем сделать то же самое в этом случае.
Первая группа, связанная с предотвращением дублирования регистрации, в конечном итоге будет очень похожа на решение первой задачи.
Вторая группа, имеющая дело с проверками корзины, кажется, вращается вокруг корзины, настроенной с некоторыми товарами, и способа оплаты, зарегистрированного или не зарегистрированного. Нет необходимости каждый раз повторять весь поток, мы можем выделить общую структуру, такую как приведенную ниже:
Дан пользователь с методом оплаты Когда пользователь проверяет корзину Тогда статус заказа должен быть И сообщение об отображении заказа должно быть Примеры: | статус способа оплаты | статус заказа | сообщение о заказе | | нет | в ожидании | требуется способ оплаты | | зарегистрирован | в ожидании | обработка платежей |
На этом этапе мы также можем перефразировать названия сценариев. Большинство заголовков сценариев в исходном примере, по-видимому, подразумевают настройку теста или тестируемое действие. Они не предоставляют возможностей для проверки. Том Роден написал:
Один из способов, который я считаю полезным для быстрой проверки сценариев, прочитать их в обратном порядке, а затем прочитать заголовок — подтверждает ли результат заголовок? Также является ли заголовок достаточно конкретным, чтобы описать правило без необходимости читать все примеры (о, и примеры хотя бы отдаленно связаны с заголовком).
Создавая схемы сценариев вокруг групп, мы получаем возможность создавать более содержательные заголовки, которые будут относиться к бизнес-правилам, а не просто к фрагменту. Том предложил следующее название:
Сценарий: для обработки заказа требуется действительный способ оплаты
Изучение границ
План сценария с несколькими примерами — отличное начало для разговора. Чтобы проверить, действительно ли это то, что мы должны делать, используйте технику Simple-Counter-Boundary . Эти два начальных примера являются простыми. Далее нам нужно попытаться определить встречные примеры, которые могут нарушать одно из проиллюстрированных правил.
Во-первых, очень подозрительно относитесь к столбцу таблицы, который имеет только одно значение. Если статус заказа всегда будет в ожидании, лучше переместить его в схему сценария над таблицей примеров. Но сначала, можем ли мы придумать какой-нибудь контрпример, который мог бы нарушить это правило? Как насчет пустой корзины? Вероятно, мы не хотим отправлять заказ на оплату, а вместо этого показываем другое сообщение.
Рассмотрение этой темы открывает другую структуру. Возможно, нам нужно посмотреть на количество товаров в корзине.
Примеры: | статус способа оплаты | количество предметов | статус заказа | сообщение о заказе | | нет | 0 | недействительный | пустая корзина | | нет | 1 | в ожидании | требуется способ оплаты | | зарегистрирован | 0 | недействительный | пустая корзина | | зарегистрирован | 1 | в ожидании | обработка платежей |
Последним шагом будет просмотр дополнительных границ с использованием этой структуры. Например, может ли какой-либо статус способа оплаты вызвать дальнейшее осложнение? Том Роден предложил два примера, которые могут быть проблематичными: просроченный и неактивный. Возможно, нам не следует предъявлять просроченные платежные карты к оплате.
| истек | 1 | ???? | срок действия способа оплаты истек | | неактивный | 1 | ???? | ???? |
Что касается неактивных методов, это интересный вопрос, на который нужно ответить с учетом специфики бизнеса. Например, иногда клиенты отправляют запрос на возврат средств, не распознавая заказ, или процессор кредитных карт может пометить некоторые номера карт как потенциально украденные или мошеннические. Мы можем принять решение деактивировать такие способы оплаты до тех пор, пока не получим решение проблемы. Заинтересованные стороны бизнеса могут решить временно приостановить действие учетной записи клиента и запретить им больше делать заказы или разрешить заказы, но потребовать другой способ оплаты.
Наконец, количество элементов, равное 1 или 0, не имеет большого значения, если только нет каких-либо других конкретных ограничений. Вот где может помочь задать экстремальный вопрос . Проверьте, должен ли заказ с 100 000 товаров просто перейти непосредственно к обработке платежа или нет. Если представители бизнеса начнут ломать голову, возможно, существует какой-то верхний предел, который потребует дополнительной проверки рисков. Если нет, нам, вероятно, следует удалить номер и перефразировать его как-то по-другому.
Мы могли бы пойти и в другом направлении. Как насчет заказа с -1 товарами? Прежде чем вы отвергнете это как глупую ситуацию, которой никогда не могло произойти, вы должны знать, что один из крупнейших интернет-магазинов столкнулся с этой проблемой и потерял на ней деньги. (Полную историю см. в главе «-1 books» моей книги «Люди против компьютеров»). Некоторые системы допускают возврат как «отрицательный заказ» и в таких случаях должны обрабатывать возврат. Некоторые системы должны просто вежливо отказаться от этого. В любом случае, обсудить это не помешает.
Раздельная проверка и обработка
Даже если мы решим категорически отказаться от отрицательных заказов, как и от пустых, эта структура все равно оставляет нам довольно много вещей, которые можно попробовать в сценарии. Зачем останавливаться на 0 и 1 элементах? Должны ли мы тестировать 2, 3, 4 и так далее? В этом тестировщики и разработчики обычно расходятся во мнениях. Разработчики часто утверждают, что все эти сценарии должны иметь одинаковый результат, поэтому достаточно протестировать один. Тестировщики больше внимания уделяют разнице между и и делают , поэтому они могут захотеть проверить различные сценарии, чтобы убедиться, что ожидания соответствуют действительности.
Хороший способ решить эту проблему, чтобы обе группы были довольны, но при этом не допустить чрезмерного усложнения сценариев, — разделить проверку и обработку . Существует множество способов, которыми что-то вроде корзины покупок может быть недействительным, но мы можем определить это отдельно от передачи действительной корзины. Разделение примеров, которые делают что-то допустимым или недействительным, от примеров, которые показывают, как обрабатывать допустимую сущность, обычно является хорошим способом избежать декартова произведения границ.
Функция: Оформление заказа @JRA-1912 Сценарий: Оформление заказа в зависимости от способа оплаты Учитывая пользователя с методом оплаты Когда пользователь проверяет действующую корзину покупок Тогда статус заказа должен быть "в ожидании" И сообщение об отображении заказа должно быть Примеры: | статус способа оплаты | сообщение о заказе | | нет | требуется способ оплаты | | действительный и текущий | обработка платежей | | истек | срок действия способа оплаты истек | | неактивный | ??? | @JRA-1912 Сценарий: статус корзины на основе товаров Учитывая пользователя с в корзине И порог риска для ордеров 1000 Когда пользователь пытается проверить Тогда статус корзины должен быть Примеры: | количество предметов | статус | | -1 | недействительный | | 0 | недействительный | | 1 | действительный | | 999 | действительный | | 1000 | действительный | | 1001 | недействительный | | 1000000 | недействительный |
Добавление валидности в модель также проясняет, почему разработчики ожидали, что кейсы с 2, 3, 4 элементами будут работать одинаково. Смоделировав его, мы можем структурировать систему так, чтобы о ней было легко рассуждать. Это также облегчает развитие системы в будущем. Эта структура позволяет нам расширить концепцию действительности корзины, добавив другие категории, например, товаров, которых нет в наличии, или разбивку количества на группы отдельных типов товаров (например, кто-то может попробовать заказать 10 копий одной книги, и -6 копии другого). Для этого не потребуется изменять сценарий «Оформление заказа в зависимости от способа оплаты».
Остерегайтесь простых исправлений
Подобно предыдущим испытаниям, это было легко исправить на поверхности. Мы могли бы просто скопировать этапы настройки в каждый сценарий и разбить цепочки. Однако реструктуризация в группы и исследование границ позволяет нам обсуждать аспекты системы, которые были бы упущены из виду. Это, в свою очередь, позволяет людям разработать лучшее решение и избежать сложных проблем. Остерегайтесь простых поверхностных исправлений для цепочек сценариев и используйте возможность углубиться при реструктуризации таких файлов.